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题留个坑 最近搞出来
标签:AtCoder,ch,Beginner,Contest,int,while,maxn,ans,getchar From: https://www.cnblogs.com/Vellichor/p/16928465.html