Codeforces Round #629 (Div. 3) 补题

  这次div3打的过于自闭,各种进不去页面,各种WA,各种智障思路......

  下次网络再卡试试这个,或者挂个梯子吧。

  赛后看题解发现交上去的题似乎都想麻烦了,于是决定重补一遍,洗心革面,重新做人。


Tutorial


A

  输入两个数a、b, 问a最少增加多少可以成为b的倍数。

  假设a是kb+m,那么只需要增加b-m,即b-a%b,特判a%b==0即可。

 1 #pragma GCC optimize(2)
 2 #include<iostream>
 3 #include<stdio.h>
 4 #include<cstdio>
 5 #include<string.h>
 6 #include<algorithm>
 7 #include<vector>
 8 #include<queue>
 9 #include<map>
10 #include<cmath>
11 #include<set>
12 #define INF 0x3f3f3f3f
13 typedef long long ll;
14 using namespace std;
15 inline void read(int &p)
16 {
17     p=0;int flag=1;char c=getchar();
18     while(!isdigit(c)) {if(c=='-') flag=-1;c=getchar();}
19     while(isdigit(c)) {p=p*10+c-'0';c=getchar();}p*=flag;
20 }
21 int a,b,q;
22 int main()
23 {
24     #ifdef LOCAL
25     freopen("in.txt","r",stdin);
26     freopen("out.txt","w",stdout);
27     #endif
28     read(q);
29     while(q--){
30         cin>>a>>b;
31         if(a%b==0){
32             cout<<0<<endl;
33         }
34         else{
35             cout<<b-a%b<<endl;
36         }
37     }
38     return 0;
39 }
View Code

B

  长度为n的字符串,包含两个b,其余为a,求所有构成的字符串按字典序排序后第k个字符串。

  比赛时的想法是先确定第一个b的位置,n是1e5,于是用了二分确定位置,然后再确定第二个b的位置就是容易的。在二分上浪费了巨多时间,还因为爆int交了两发wa,赛后看题解发现根本不用二分直接从右向左遍历即可,心态爆炸......

 1 #pragma GCC optimize(2)
 2 #include<iostream>
 3 #include<stdio.h>
 4 #include<cstdio>
 5 #include<string.h>
 6 #include<algorithm>
 7 #include<vector>
 8 #include<queue>
 9 #include<map>
10 #include<cmath>
11 #include<set>
12 #define INF 0x3f3f3f3f
13 typedef long long ll;
14 using namespace std;
15 inline void read(int &p)
16 {
17     p=0;int flag=1;char c=getchar();
18     while(!isdigit(c)) {if(c=='-') flag=-1;c=getchar();}
19     while(isdigit(c)) {p=p*10+c-'0';c=getchar();}p*=flag;
20 }
21 int q,n,k;
22 int main()
23 {
24     #ifdef LOCAL
25     freopen("in.txt","r",stdin);
26     freopen("out.txt","w",stdout);
27     #endif
28     read(q);
29     while(q--){
30         int l,r;
31         read(n),read(k);
32         for(int i=n-1;i>=1;i--){
33             if(k<=n-i){
34                 l=i;
35                 r=n-k+1;
36                 break;
37             }
38             k-=n-i;
39         }
40         for(int i=1;i<=n;i++){
41             if(i==l||i==r){
42                 putchar('b');
43             }
44             else{
45                 putchar('a');
46             }
47         }
48         putchar('\n');
49         
50     }
51     return 0;
52 }
View Code

C

  定义一种只包含0 1 2的数字,这种数字的xor运算为对应每一位的和mod3。给出这种数字x,求a b,使得a xor b==x,并且max(a,b)最小。

  这道题比赛时思路应该是正确的,但是写的比较乱。按照每一位考虑,要得到0,需要0 0或者1 2,可以发现对于得到0选取0 0永远是最优的。要得到1需要1 0或2 2,遇到要得到1,我们选取1 0永远更优。要得到2,可以选取1 1和0 2。可以发现要得到1,对应位上的两个数有1 0和0 1的差别,得到2也有0 2,2 0,1 1的差别。这些都会对max(a,b)造成影响。我们只需要在第一次遇到1时给a对应位赋1,b对应位赋0,之后遇到1时给a对应位赋0,b对应位赋1。遇到1之前,遇到2时给a对应位赋1,b对应位赋1。遇到1之后,遇到2时给a对应位赋0,b对应位赋2,就可以使max(a,b)最小,不容易说明白,但其实观察样例就能发现。

 1 #pragma GCC optimize(2)
 2 #include<iostream>
 3 #include<stdio.h>
 4 #include<cstdio>
 5 #include<string.h>
 6 #include<algorithm>
 7 #include<vector>
 8 #include<queue>
 9 #include<map>
10 #include<cmath>
11 #include<set>
12 #define INF 0x3f3f3f3f
13 typedef long long ll;
14 using namespace std;
15 inline void read(int &p)
16 {
17     p=0;int flag=1;char c=getchar();
18     while(!isdigit(c)) {if(c=='-') flag=-1;c=getchar();}
19     while(isdigit(c)) {p=p*10+c-'0';c=getchar();}p*=flag;
20 }
21 int main()
22 {
23     #ifdef LOCAL
24     freopen("in.txt","r",stdin);
25     freopen("out.txt","w",stdout);
26     #endif
27     int q;
28     read(q);
29     while(q--){
30         int n;
31         read(n);
32         string a,b;
33         char v;
34         bool flag=true;
35         for(int i=1;i<=n;i++){
36             v=getchar();
37             if(v=='2'){
38                 if(flag){
39                     a+='1';
40                     b+='1';
41                 }
42                 else{
43                     a+='0';
44                     b+='2';
45                 }
46             }
47             else if(v=='0'){
48                 a+='0';
49                 b+='0';
50             }
51             else{
52                 if(flag){
53                     a+='1';
54                     b+='0';
55                     flag=false;
56                 }
57                 else{
58                     a+='0';
59                     b+='1';
60                 }
61             }
62         }
63         cout<<a<<"\n"<<b<<'\n';
64     }
65     return 0;
66 }
View Code

D

 题意有点复杂,不重复了...

  因为前面的智障思路,写到这道题的时候已经没什么时间了,并且这道题还想出了更智障的思路......

  正解:首先容易想到最多只有3种颜色。如果所有数字都一样,那么只需要一种颜色;如果n是偶数,那么[1,2,1,2,...]一定是符合条件的;考虑n为奇数,如果存在两个相同的数字相邻,只需要把这两个数字看成一个数字,按照n为偶数染色就好了;否则,可以看作n个不同的数绕成一个环,前n-1个数按照偶数情况染色,最后一个数染成3就符合情况。

 1 #pragma GCC optimize(2)
 2 #include<iostream>
 3 #include<stdio.h>
 4 #include<cstdio>
 5 #include<string.h>
 6 #include<algorithm>
 7 #include<vector>
 8 #include<queue>
 9 #include<map>
10 #include<cmath>
11 #include<set>
12 #define INF 0x3f3f3f3f
13 typedef long long ll;
14 using namespace std;
15 inline void read(int &p)
16 {
17     p=0;int flag=1;char c=getchar();
18     while(!isdigit(c)) {if(c=='-') flag=-1;c=getchar();}
19     while(isdigit(c)) {p=p*10+c-'0';c=getchar();}p*=flag;
20 }
21 int main()
22 {
23     #ifdef LOCAL
24     freopen("in.txt","r",stdin);
25     freopen("out.txt","w",stdout);
26     #endif
27     int q;
28     read(q);
29     while(q--){
30         int n;
31         read(n);
32         bool flag=true;
33         int pos=0;
34         int pre,now,f;
35         read(pre);
36         f=pre;
37         for(int i=2;i<=n;i++){
38             read(now);
39             if(now==pre){
40                 pos=i-1;
41             }
42             else{
43                 flag=false;
44             }
45             pre=now;
46         }
47         if(flag){
48             printf("1\n");
49             for(int i=1;i<=n;i++) printf("1 ");
50             putchar('\n');
51         }
52         else if(n%2==0){
53             printf("2\n");
54             for(int i=1;i<=n;i++)
55                 if(i%2) printf("1 ");
56                 else printf("2 ");
57             putchar('\n');
58         }
59         else{
60             if(pos){
61                 printf("2\n");
62                 for(int i=1;i<=pos;i++)
63                     if(i%2) printf("1 ");
64                     else printf("2 ");
65                 for(int i=pos+1;i<=n;i++)
66                     if(i%2) printf("2 ");
67                     else printf("1 ");
68                 putchar('\n');
69             }
70             else{
71                 if(f==now){
72                     printf("2\n");
73                     for(int i=1;i<n;i++)
74                         if(i%2) printf("1 ");
75                         else printf("2 ");
76                     printf("1 \n");
77                 }
78                 else{
79                     printf("3\n");
80                     for(int i=1;i<n;i++)
81                         if(i%2) printf("1 ");
82                         else printf("2 ");
83                     printf("3\n");
84                 }
85             }
86         }
87     }
88     return 0;
89 }
View Code

猜你喜欢

转载自www.cnblogs.com/DinoMax/p/12596011.html