A
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stdlib.h> 6 #include<vector> 7 #include<cmath> 8 #include<queue> 9 #include<set> 10 using namespace std; 11 #define N 105 12 #define LL long long 13 #define INF 0xfffffff 14 const double eps = 1e-8; 15 const double pi = acos(-1.0); 16 const double inf = ~0u>>2; 17 char s[N]; 18 int main() 19 { 20 int i,j,k; 21 cin>>s; 22 k = strlen(s); 23 int ans = 1,g=1; 24 for(i = 1; i < k ;i++) 25 { 26 if(s[i]!=s[i-1]) 27 { 28 g = 1; 29 ans++; 30 } 31 else g++; 32 if(g>5) 33 { 34 g = 1; 35 ans++; 36 } 37 //cout<<ans<<" "<<g<<" "<<s[i]<<endl; 38 } 39 cout<<ans<<endl; 40 return 0; 41 }
B
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stdlib.h> 6 #include<vector> 7 #include<cmath> 8 #include<queue> 9 #include<set> 10 using namespace std; 11 #define N 5050 12 #define LL long long 13 #define INF 0xfffffff 14 const double eps = 1e-8; 15 const double pi = acos(-1.0); 16 const double inf = ~0u>>2; 17 int a[N],f[N]; 18 int main() 19 { 20 int i,j,n,k; 21 cin>>n; 22 for(i =1;i <= n; i++)cin>>a[i]; 23 for(i = 1;i <= n ;i++) 24 { 25 f[a[i]] = 1; 26 } 27 int ans=0; 28 for(i = 1; i<= n; i++) 29 if(!f[i]) ans++;cout<<ans<<endl; 30 return 0; 31 }
C
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stdlib.h> 6 #include<vector> 7 #include<cmath> 8 #include<queue> 9 #include<set> 10 using namespace std; 11 #define N 100010 12 #define LL long long 13 #define INF 0xfffffff 14 const double eps = 1e-8; 15 const double pi = acos(-1.0); 16 const double inf = ~0u>>2; 17 struct node 18 { 19 int x,y; 20 }p[N]; 21 bool cmp(node a,node b) 22 { 23 return a.x<b.x; 24 } 25 int main() 26 { 27 int i,j,n; 28 cin>>n; 29 for(i = 1; i <= n ;i++) 30 cin>>p[i].x>>p[i].y; 31 sort(p+1,p+n+1,cmp); 32 int mm = 0,ans=0; 33 for(i = 1; i <= n ;i ++) 34 { 35 if(p[i].y<mm) 36 ans++; 37 mm = max(mm,p[i].y); 38 39 } 40 cout<<ans<<endl; 41 return 0; 42 }
D
dp 先预处理出来i-j距离回文串所差的步数 然后D出1-k所需最少的步数 记录一下路径 最后输出
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stdlib.h> 6 #include<vector> 7 #include<cmath> 8 #include<queue> 9 #include<set> 10 using namespace std; 11 #define N 505 12 #define LL long long 13 #define INF 0xfffffff 14 const double eps = 1e-8; 15 const double pi = acos(-1.0); 16 const double inf = ~0u>>2; 17 char s[N]; 18 int dp[505][505],o[505][505],e[505][505]; 19 int p[505]; 20 int dfs(int i,int j) 21 { 22 int a,b; 23 int o1 = 0; 24 int ii = i,jj = j; 25 while(ii<jj) 26 { 27 if(s[ii]!=s[jj]) o1++; 28 ii++,jj--; 29 } 30 return o1; 31 } 32 int main() 33 { 34 int i,j,n,kk,k,g; 35 for(i = 0 ;i <= 500 ; i++) 36 for(j = 0 ; j <=500 ; j++) 37 dp[i][j] = INF; 38 cin>>s; 39 kk = strlen(s); 40 cin>>k; 41 for(i = 0 ;i < kk ;i++) 42 for(j = i ; j < kk ;j++) 43 o[i][j] = dfs(i,j); 44 for(i = 0; i < kk; i++) 45 { 46 dp[i][1] = o[0][i]; 47 } 48 for(i = 0 ;i < kk ;i++) 49 for(j = 2 ; j <= min(i+1,k) ; j++) 50 for(g = 0 ; g < i ; g++) 51 { 52 if(dp[i][j]>dp[g][j-1]+o[g+1][i]) 53 { 54 dp[i][j] = dp[g][j-1]+o[g+1][i]; 55 e[i][j] = g; 56 } 57 } 58 int minz = INF,x; 59 for(i = 1 ; i <= k ;i++) 60 { 61 if(minz>dp[kk-1][i]) 62 { 63 minz = dp[kk-1][i]; 64 x = i; 65 } 66 } 67 cout<<minz<<endl; 68 if(x==1) 69 { 70 for(i = 0; i < kk/2 ; i++) 71 printf("%c",s[i]); 72 for(i = (kk-1)/2 ; i >= 0 ; i--) 73 printf("%c",s[i]); 74 return 0; 75 } 76 g = 0; 77 int ki = kk-1; 78 while(x!=1) 79 { 80 ki = e[ki][x]; 81 p[g++] = ki; 82 x--; 83 } 84 sort(p,p+g); 85 for(i = 0 ;i <= p[0]/2 ; i++) 86 printf("%c",s[i]); 87 if(p[0]) 88 { 89 for(i = (p[0]-1)/2 ; i >= 0 ; i--) 90 printf("%c",s[i]); 91 } 92 for(i = 0 ; i < g-1 ;i++) 93 { 94 printf("+"); 95 for(j = p[i]+1 ;j <= p[i]+(p[i+1]-p[i]+1)/2 ; j++) 96 cout<<s[j]; 97 for(j = p[i]+(p[i+1]-p[i])/2 ;j >= p[i]+1 ; j--) 98 cout<<s[j]; 99 } 100 if(p[g-1]+1<kk) 101 printf("+"); 102 for(i = p[g-1]+1 ; i <= p[g-1]+(kk-p[g-1])/2 ; i++) 103 cout<<s[i]; 104 for(i = p[g-1]+(kk-p[g-1]-1)/2 ; i >= p[g-1]+1 ; i--) 105 cout<<s[i]; 106 cout<<endl; 107 return 0; 108 }
E
元音-1 辅音+2 开数组sum[i]存前i项和 也就是找最大段(i,j)使sum[j]-sum[i]>=0
这样只存下降的sum数组即可 因为上升的的某个g事不需要的 二分查找第一个小于等于sun[i]的位置 取最大
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stdlib.h> 6 #include<vector> 7 #include<cmath> 8 #include<queue> 9 #include<set> 10 using namespace std; 11 #define N 200010 12 #define LL long long 13 #define INF 0xfffffff 14 const double eps = 1e-8; 15 const double pi = acos(-1.0); 16 const double inf = ~0u>>2; 17 char s[N]; 18 int sum[N]; 19 struct node 20 { 21 int a,po; 22 }p[N]; 23 int bfind(int l,int h,int k) 24 { 25 int m; 26 while(l<h) 27 { 28 m = (l+h)>>1; 29 if(p[m].a<k) 30 h = m; 31 else if(p[m].a>k) 32 l = m+1; 33 else return p[m].po; 34 } 35 return p[l].po; 36 } 37 int judge(char c) 38 { 39 if(c=='a'||c=='e'||c=='i'||c=='o'||c=='u') 40 return 1; 41 if(c=='A'||c=='E'||c=='I'||c=='O'||c=='U') 42 return 1; 43 return 0; 44 } 45 int main() 46 { 47 int i,j,k; 48 cin>>s; 49 k = strlen(s); 50 int g = 0; 51 for(i = 0; i < k ;i++) 52 { 53 if(i==0) 54 { 55 if(judge(s[i])) 56 sum[0] = -1; 57 else 58 sum[0] = 2; 59 p[++g].a = sum[i]; 60 p[g].po = i; 61 } 62 else 63 { 64 if(judge(s[i])) 65 sum[i] = sum[i-1]-1; 66 else 67 sum[i] = sum[i-1]+2; 68 if(sum[i]<p[g].a) 69 { 70 p[++g].a = sum[i]; 71 p[g].po = i; 72 } 73 } 74 } 75 int ans=0,cnt=0; 76 for(i = 0 ; i < k ;i++) 77 { 78 if(sum[i]>=0) 79 { 80 ans = i+1; 81 cnt = 1; 82 } 83 else 84 { 85 int o = i-bfind(1,g,sum[i]); 86 //cout<<o<<" "<<i<<" "<<bfind(1,g,sum[i])<<endl; 87 if(o>ans) 88 { 89 ans = o; 90 cnt = 1; 91 } 92 else if(o==ans) 93 cnt++; 94 } 95 } 96 if(ans) 97 cout<<ans<<" "<<cnt<<endl; 98 else 99 puts("No solution"); 100 return 0; 101 }