2018.9.20 Educational Codeforces Round 51

蒟蒻就切了四道水题,然后EF看着可写然而并不会,中间还WA了一次,我太菜了.jpg =。=

A.Vasya And Password

一开始看着有点虚没敢立刻写,后来写完第二题发现可以暴力讨论,因为保证有解,没了

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int N=105;
 6 char rd[N];
 7 int main ()
 8 {
 9     int T;
10     scanf("%d",&T);
11     while(T--)
12     {
13         scanf("%s",rd);
14         int c1=0,c2=0,c3=0,len=strlen(rd);
15         for(int i=0;i<len;i++) 
16         {
17             if(rd[i]>='0'&&rd[i]<='9') c1++;
18             if(rd[i]>='A'&&rd[i]<='Z') c2++;
19             if(rd[i]>='a'&&rd[i]<='z') c3++;
20         }
21         if(!c1&&!c2&&c3)
22             rd[0]='0',rd[1]='A';
23         else if(!c1&&c2&&!c3)
24             rd[0]='0',rd[1]='a';
25         else if(c1&&!c2&&!c3)
26             rd[0]='a',rd[1]='A';
27         else if(c1&&c2&&!c3)
28         {
29             if(c1>1) 
30             {
31                 for(int i=0;i<len;i++) 
32                     if(rd[i]>='0'&&rd[i]<='9') {rd[i]='a';break;}
33             }
34             else if(c2>1)
35             {
36                 for(int i=0;i<len;i++) 
37                     if(rd[i]>='A'&&rd[i]<='Z') {rd[i]='a';break;}
38             }
39         }
40         else if(c1&&!c2&&c3)
41         {
42             if(c1>1) 
43             {
44                 for(int i=0;i<len;i++) 
45                     if(rd[i]>='0'&&rd[i]<='9') {rd[i]='A';break;}
46             }
47             else if(c3>1)
48             {
49                 for(int i=0;i<len;i++) 
50                     if(rd[i]>='a'&&rd[i]<='z') {rd[i]='A';break;}
51             }
52         }
53         else if(!c1&&c2&&c3)
54         {
55             if(c3>1) 
56             {
57                 for(int i=0;i<len;i++) 
58                     if(rd[i]>='a'&&rd[i]<='z') {rd[i]='0';break;}
59             }
60             else if(c2>1)
61             {
62                 for(int i=0;i<len;i++) 
63                     if(rd[i]>='A'&&rd[i]<='Z') {rd[i]='0';break;}
64             }
65         }
66         for(int i=0;i<len;i++) printf("%c",rd[i]); printf("\n");
67     }
68     return 0;
69 }
View Code

B.Relatively Prime Pairs

想了一会一拍脑袋,这题\*\*这么水还想啥,输出相邻数字,没了

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 long long l,r;
 6 int main ()
 7 {
 8     scanf("%lld%lld",&l,&r);
 9     printf("YES\n");
10     for(long long i=l;i<=r;i+=2)
11         printf("%lld %lld\n",i,i+1);
12     return 0;
13 }
View Code

C.Vasya and Multisets

需要稍微想一想的题,然而本质上还是个分类讨论

考虑每种数字出现不同次数带来的影响,出现一次的一定对一个集合有贡献,出现两次的怎么放都没有影响,出现三次及以上的可以令它对一个集合有贡献,也可以令它没有影响

所以首先除去所有出现两次的数(都丢给一个集合即可),然后看看出现一次的有奇数个还是偶数个。如果有奇数个且没有出现三次以上的则无解;如果有奇数个且有出现三次及以上的就先两两分开出现一次的,把剩下那个放在一个集合,出现三次及以上的一个数放一个在另一个集合,然后剩下的一股脑丢在一个集合里;如果有偶数个就凉凉分开然后剩下的直接丢在一个集合里

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int N=105;
 6 long long num[N],cnt[N];
 7 char outp[N];
 8 bool used[N];
 9 long long n,und,ans,k;
10 int main ()
11 {
12     scanf("%lld",&n);
13     for(int i=1;i<=n;i++)
14         scanf("%lld",&num[i]),cnt[num[i]]++;
15     for(int i=1;i<=100;i++)
16         if(cnt[i]==2) 
17         {
18             for(int j=1;j<=n;j++) 
19                 if(num[j]==i) used[j]=1,outp[j]='A'; 
20         }
21         else if(cnt[i]>=3)
22         {
23             und++;
24             for(int j=1;j<=n;j++) 
25                 if(num[j]==i) used[j]=1;
26         }
27 //    for(int i=1;i<=n;i++) printf("%c",outp[i]);
28     for(int i=1;i<=n;i++) if(!used[i]) ans++,outp[i]=(k^=1)?'A':'B';
29     if((ans&1)&&!und) {printf("NO");return 0;}
30     else
31     {
32         if((ans&1)==0) 
33         {for(int i=1;i<=n;i++) if(used[i]) outp[i]='A';
34         }
35             else 
36             {
37                 bool flag=true;
38                 for(int i=1;i<=n;i++) if(used[i]&&cnt[num[i]]!=2) 
39                 {
40                     if(flag)outp[i]='B',flag=false;
41                     else outp[i]='A';
42                 }
43             }
44     }
45     printf("YES\n");
46     for(int i=1;i<=n;i++)
47         printf("%c",outp[i]);
48     return 0;
49 }
View Code

D.Bicolorings

递推题,画图推式子即可

设$rec[i][j][0/1][0/1]$表示到第$i$列分出了$j$块,且第$i$列上面为白/黑,下面为白/黑的方案数,这样就足够递推了,讨论新加入的两块与之前的联通情况即可

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int N=1005;
 6 const long long mod=998244353;
 7 long long rec[N][2*N][2][2];
 8 long long n,m;
 9 int main ()
10 {
11     scanf("%lld%lld",&n,&m);
12     rec[1][1][0][0]=rec[1][1][1][1]=1;
13     rec[1][2][1][0]=rec[1][2][0][1]=1;
14     for(int i=2;i<=n;i++)
15         for(int j=1;j<=2*i;j++)
16         {
17             rec[i][j][0][0]+=rec[i-1][j][0][1]+rec[i-1][j][1][0]+rec[i-1][j][0][0]+rec[i-1][j-1][1][1]; 
18             rec[i][j][1][1]+=rec[i-1][j][1][0]+rec[i-1][j][0][1]+rec[i-1][j][1][1]+rec[i-1][j-1][0][0]; 
19             rec[i][j][0][1]+=rec[i-1][j][0][1]+rec[i-1][j-1][0][0]+rec[i-1][j-1][1][1]; if(j>=2) rec[i][j][0][1]+=rec[i-1][j-2][1][0];
20             rec[i][j][1][0]+=rec[i-1][j][1][0]+rec[i-1][j-1][0][0]+rec[i-1][j-1][1][1]; if(j>=2) rec[i][j][1][0]+=rec[i-1][j-2][0][1];
21             rec[i][j][0][0]%=mod;rec[i][j][1][1]%=mod;rec[i][j][0][1]%=mod;rec[i][j][1][0]%=mod;
22         }
23     printf("%lld",(rec[n][m][0][0]+rec[n][m][1][1]+rec[n][m][0][1]+rec[n][m][1][0])%mod);
24     return 0;
25 }
View Code

E.

猜你喜欢

转载自www.cnblogs.com/ydnhaha/p/9687412.html