Codeforces Round #533 (Div. 2) ABCD 题解
Posted vbel
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #533 (Div. 2) ABCD 题解相关的知识,希望对你有一定的参考价值。
题目链接
A. Salem and Sticks
分析
暴力就行,题目给的n<=1000,ai<=100,暴力枚举t,t从2枚举到98,复杂度是1e5,完全可行.
代码
1 #include <cstdio> 2 #include <cmath> 3 #include <iostream> 4 #include <cstring> 5 #include <algorithm> 6 #include <vector> 7 #include <string> 8 #include <utility> 9 #include <queue> 10 #include <stack> 11 #include <map> 12 #include <set> 13 using namespace std; 14 const int INF=0x3f3f3f3f; 15 16 int a[1000]; 17 18 int main() 19 { 20 // freopen("in.txt","r",stdin); 21 // freopen("out.txt","w",stdout); 22 int n; 23 cin>>n; 24 for(int i=0;i<n;i++) cin>>a[i]; 25 int ans=INF,res; 26 for(int i=2;i<100;i++) 27 { 28 int sum=0; 29 for(int j=0;j<n;j++) 30 { 31 int x=a[j]-i; 32 if(x<0) x*=-1; 33 if(x>1) sum=sum+x-1; 34 } 35 if(ans>sum) ans=sum,res=i; 36 } 37 cout<<res<<‘ ‘<<ans<<endl; 38 return 0; 39 }
B. Zuhair and Strings
分析
暴力题,暴力查找k个相同字母组成的序列就行.
代码
1 #include <cstdio> 2 #include <cmath> 3 #include <iostream> 4 #include <cstring> 5 #include <algorithm> 6 #include <vector> 7 #include <string> 8 #include <utility> 9 #include <queue> 10 #include <stack> 11 #include <map> 12 #include <set> 13 using namespace std; 14 const int INF=0x3f3f3f3f; 15 16 char a[200000]; 17 int ans[26]; 18 19 int main() 20 { 21 // freopen("in.txt","r",stdin); 22 // freopen("out.txt","w",stdout); 23 int n,k; 24 cin>>n>>k; 25 getchar(); 26 for(int i=0;i<n;i++) scanf("%c",&a[i]); 27 int i=0; 28 while(i<n) 29 { 30 char s=a[i]; 31 int j=0; 32 while(j<k&&i+j<n) 33 { 34 if(a[i+j]!=s) break; 35 j++; 36 } 37 if(j==k) ans[s-‘a‘]++; 38 i=i+j; 39 } 40 int res=0; 41 for(int i=0;i<26;i++) 42 res=max(res,ans[i]); 43 cout<<res<<endl; 44 return 0; 45 }
C. Ayoub and Lost Array
分析
计数dp,算出l到r区间中mod3是0的数a0,mod3是1的数a1,mod3是2的数a2,dp[i][j]表示,i个数的和mod3是j,dp[1][0]=a0,dp[1][1]=a1,dp[1][2]=a3,i从2开始更新,最后dp[n][0]就是答案.
代码
1 #include <cstdio> 2 #include <cmath> 3 #include <iostream> 4 #include <cstring> 5 #include <algorithm> 6 #include <vector> 7 #include <string> 8 #include <utility> 9 #include <queue> 10 #include <stack> 11 #include <map> 12 #include <set> 13 using namespace std; 14 const int INF=0x3f3f3f3f; 15 16 const int mod=1000000007; 17 long long dp[200001][3]; 18 19 int main() 20 { 21 // freopen("in.txt","r",stdin); 22 // freopen("out.txt","w",stdout); 23 int n,l,r; 24 cin>>n>>l>>r; 25 long long a0,a1,a2; 26 a0=r/3-(l-1)/3; 27 a1=(r+2)/3-(l+1)/3; 28 a2=(r+1)/3-l/3; 29 dp[1][0]=a0,dp[1][1]=a1,dp[1][2]=a2; 30 for(int i=2;i<=n;i++) 31 { 32 dp[i][0]=(dp[i-1][0]*a0+dp[i-1][1]*a2+dp[i-1][2]*a1)%mod; 33 dp[i][1]=(dp[i-1][0]*a1+dp[i-1][1]*a0+dp[i-1][2]*a2)%mod; 34 dp[i][2]=(dp[i-1][0]*a2+dp[i-1][1]*a1+dp[i-1][2]*a0)%mod; 35 } 36 cout<<dp[n][0]<<endl; 37 return 0; 38 }
D. Kilani and the Game
分析
bfs扩展题,这里的bfs需要控制步数且同时进行,每个玩家的speed就要求控制步数,同时进行是为了防止一个点扩展后把另一个点包住导致另一个点无法扩展,可以用优先队列设置优先级来完成这个bfs,结构体可以设置 a,b坐标,c步数(在一个回合内走了多少步),d回合数,e序数(第几个玩家),优先级设置是 回合数(从小到大)>序列数(从小到大)>步数(从小到大),需要注意的是优先队列的排序方式,优先队列是默认大的在前,小的在后.
代码
1 #include <cstdio> 2 #include <cmath> 3 #include <iostream> 4 #include <cstring> 5 #include <algorithm> 6 #include <vector> 7 #include <string> 8 #include <utility> 9 #include <queue> 10 #include <stack> 11 #include <map> 12 #include <set> 13 using namespace std; 14 const int INF=0x3f3f3f3f; 15 16 struct N 17 { 18 int a,b,c,d,e; 19 N (){} 20 N (int x,int y,int s,int t,int u){a=x,b=y,c=s,d=t,e=u;} 21 bool operator < (const N &x)const 22 { 23 if(d!=x.d) return d>x.d; 24 else if(e!=x.e) return e>x.e; 25 else return c>x.c; 26 } 27 }; 28 29 char mapp[1000][1000]; 30 priority_queue<N> que; 31 int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1}; 32 int ans[10]; 33 int speed[10]; 34 int n,m; 35 36 void bfs(void) 37 { 38 while(que.size()) 39 { 40 N p=que.top();que.pop(); 41 int x=p.a,y=p.b,step=p.c,turn=p.d,s=p.e; 42 for(int i=0;i<4;i++) 43 { 44 int nx=x+dx[i],ny=y+dy[i]; 45 if(nx>=0&&nx<n&&ny>=0&&ny<m&&mapp[nx][ny]==‘.‘) 46 { 47 mapp[nx][ny]=mapp[x][y]; 48 ans[s]++; 49 if(step+1<speed[s]) que.push(N(nx,ny,step+1,turn,s)); 50 else que.push(N(nx,ny,0,turn+1,s)); 51 } 52 } 53 /* for(int i=0;i<n;i++) 54 { 55 for(int j=0;j<m;j++) cout<<mapp[i][j]; 56 cout<<endl; 57 } 58 */ } 59 } 60 61 int main() 62 { 63 // freopen("in.txt","r",stdin); 64 // freopen("out.txt","w",stdout); 65 66 int p; 67 cin>>n>>m>>p; 68 for(int i=1;i<=p;i++) cin>>speed[i]; 69 for(int i=0;i<n;i++) 70 for(int j=0;j<m;j++) 71 { 72 cin>>mapp[i][j]; 73 if(mapp[i][j]!=‘#‘&&mapp[i][j]!=‘.‘) 74 { 75 int s=mapp[i][j]-‘1‘+1; 76 que.push(N(i,j,0,0,s)),ans[s]++; 77 } 78 } 79 /* while(que.size()) 80 { 81 N p=que.top();que.pop(); 82 printf("(%d,%d) step:%d turn:%d i:%d ",p.a,p.b,p.c,p.d,p.e); 83 } 84 */ 85 bfs(); 86 for(int i=1;i<p;i++) cout<<ans[i]<<‘ ‘; 87 cout<<ans[p]<<endl; 88 return 0; 89 }
以上是关于Codeforces Round #533 (Div. 2) ABCD 题解的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #533 (Div. 2) Solution
Codeforces Round #533 (Div. 2) B. Zuhair and Strings 模拟
Codeforces Round #533 (Div. 2) ABCD 题解
Codeforces Round #533 (Div. 2)C. Ayoub and Lost Array