A,w是两个v是一个 送分题

#include<bits/stdc++.h>
using namespace std ;
#define maxn 400100
#define int long long
int read(){
    int ans = 0 , f = 1 ; char ch = getchar() ;
    while ( !isdigit(ch) ){ if( ch == '-' ) f = -1 ; ch = getchar() ; }
    while ( isdigit(ch) ) ans = (ans * 10) + (ch ^ '0') , ch = getchar() ;
    return ans * f ;
}
char in[maxn] ; 
signed main(){
//    freopen("test.in" , "r" , stdin) ;
//    freopen("test.out" , "w" , stdout) ;\
    
    scanf("%s" , in + 1) ; 
    int len = strlen(in + 1) ; 
    int sum = 0 ; 
    for(int i = 1 ; i <= len ; i++){
        if(in[i] == 'v') sum++ ; 
        else sum += 2 ; 
    }
    printf("%lld" , sum) ; 
    return 0 ;
}

B.数据范围很小 直接暴力判断即可

#include<bits/stdc++.h>
using namespace std ;
#define maxn 400100
#define int long long
int read(){
    int ans = 0 , f = 1 ; char ch = getchar() ;
    while ( !isdigit(ch) ){ if( ch == '-' ) f = -1 ; ch = getchar() ; }
    while ( isdigit(ch) ) ans = (ans * 10) + (ch ^ '0') , ch = getchar() ;
    return ans * f ;
}
char s[maxn] , t[maxn] ; 
int slen , tlen ; 
bool check(int st){
    if(st + tlen - 1 > slen) return 0 ; 
    for(int i = 1 ; i <= tlen ; i++)
        if(s[st + i - 1] != t[i]) return 0 ; 
    return 1 ; 
}
signed main(){
//    freopen("test.in" , "r" , stdin) ;
//    freopen("test.out" , "w" , stdout) ;
    scanf("%s" , s + 1) ; scanf("%s" , t + 1) ; 
    slen = strlen(s + 1) ; tlen = strlen(t + 1) ; 
    if(tlen > slen){
        printf("No") ; 
        return 0 ; 
    }
    for(int i = 1 ; i <= slen ; i++){
        if(check(i)){
            printf("Yes") ; 
            return 0 ; 
        }
    }
    printf("No") ; 
    return 0 ;
}

C.判断前面的每一竖列是否能在后面找到一样的 对于每一个竖列 计算哈希值以及有多少个 然后和后面进行比较即可

#include<bits/stdc++.h>
using namespace std ;
#define maxn 400100
#define int long long
int read(){
    int ans = 0 , f = 1 ; char ch = getchar() ;
    while ( !isdigit(ch) ){ if( ch == '-' ) f = -1 ; ch = getchar() ; }
    while ( isdigit(ch) ) ans = (ans * 10) + (ch ^ '0') , ch = getchar() ;
    return ans * f ;
}
int hsh[maxn] ; 
const int mod = 998244353 ; 
int bse = 12281 ; 
char in[maxn] ; 
int num[maxn] ; 
int h , w  ;
int pos(int i , int j){
    return (i - 1) * w + j ; 
}
map<int,int> mp1 ; 
map<int,int> mp2 ; 
int vt[maxn] , cnt ; 
signed main(){
//    freopen("test.in" , "r" , stdin) ;
//    freopen("test.out" , "w" , stdout) ;
    h = read() , w = read() ; 
    for(int i = 1 ; i <= h ; i++){
        scanf("%s" , in + 1) ; 
        for(int j = 1 ; j <= w ; j++)
            if(in[j] == '#')
                num[pos(i , j)] = 3 ; 
            else num[pos(i , j)] = 7 ; 
    }
    for(int i = 1 ; i <= w ; i++){
        int sum = 0 ; 
        for(int j = 1 ; j <= h ; j++)
            sum = (sum * bse + num[pos(j , i)]) % mod ; 
//        printf("sum : %lld \n") 
        if(!mp1[sum]) mp1[sum] = 1 , vt[++cnt] = sum; 
        else mp1[sum]++ ; 
    }
//    printf("cnt : %lld \n" , cnt) ; 
    for(int i = 1 ; i <= h ; i++){
        scanf("%s" , in + 1) ; 
        for(int j = 1 ; j <= w ; j++)
            if(in[j] == '#')
                num[pos(i , j)] = 3 ; 
            else num[pos(i , j)] = 7 ; 
    }
    for(int i = 1 ; i <= w ; i++){
        int sum = 0 ; 
        for(int j = 1 ; j <= h ; j++)
            sum = (sum * bse + num[pos(j , i)]) % mod ; 
        if(!mp2[sum]) mp2[sum] = 1; 
        else mp2[sum]++ ; 
    }
    for(int i = 1 ; i <= cnt ; i++)
        if(mp1[vt[i]] != mp2[vt[i]]){
            printf("No") ; 
            return 0 ; 
        }
    printf("Yes") ; 
    return 0 ;
}

 

D.求导之后进行二分找到最后一个使导函数大于0的点和第一个使导函数小于0的点 然后比较一下两边的值 

#include<bits/stdc++.h>
using namespace std ;
#define maxn 400100
#define int long long
int read(){
    int ans = 0 , f = 1 ; char ch = getchar() ;
    while ( !isdigit(ch) ){ if( ch == '-' ) f = -1 ; ch = getchar() ; }
    while ( isdigit(ch) ) ans = (ans * 10) + (ch ^ '0') , ch = getchar() ;
    return ans * f ;
}
double A , B ;  
signed main(){
//    freopen("test.in" , "r" , stdin) ;
//    freopen("test.out" , "w" , stdout) ;
    cin >> A >> B ; 
    double C = A / (2.0 * B) ; 
    int l = 0 , r = pow(10 , 18) ; 
    int mid = (l + r) / 2 , ans = 0 ; 
    while(l <= r){
        if(pow(1 + mid , 1.5) <= C) ans = mid , l = mid +  1 ; 
        else r = mid - 1 ; 
        mid = (l + r) / 2 ; 
//        printf("l : %lld  r: %lld \n" , l , r ) ; 
    }
    double ansa , ansb ; 
    ansa = B * ans + A / pow(1 + ans , 0.5) ; 
    ans++ ; 
    ansb = B * ans + A / pow(1 + ans , 0.5); 
    printf("%.10lf" , min(ansa , ansb)) ; 
    return 0 ;
}

EFG题留个坑 最近搞出来

原文地址:http://www.cnblogs.com/Vellichor/p/16928465.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性