这次div3打的过于自闭,各种进不去页面,各种WA,各种智障思路......
下次网络再卡试试这个,或者挂个梯子吧。
赛后看题解发现交上去的题似乎都想麻烦了,于是决定重补一遍,洗心革面,重新做人。
输入两个数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 }
长度为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 }
定义一种只包含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 }
题意有点复杂,不重复了...
因为前面的智障思路,写到这道题的时候已经没什么时间了,并且这道题还想出了更智障的思路......
正解:首先容易想到最多只有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 }