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 }
View Code

 

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 }
View Code

 

 

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 }
View Code

 

 

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 }
View Code

 

以上是关于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

Codeforces Round #533 (Div. 2) A. Salem and Sticks(暴力)

Codeforces Round #533 (Div. 2) C. Ayoub and Lost Array dp