Codeforces Round #761

A

思路

如果是t是a开头就置换b,c位置,如果a个数为0,“abc”则不用换,其他按abc顺序加入re即可

		string s,t,re;
		vector<int> a(26,0);
		cin>>s>>t;
		for(auto x:s) a[x-'a']++;
		if(t=="abc"||t=="acb")
		{
			
			if(t[1]=='b'&&a[0]!=0){
				while(a[0]--) re+='a';
				while(a[2]--) re+='c';
				while(a[1]--) re+='b';
			}
			else{
				while(a[0]--) re+='a';
				while(a[1]--) re+='b';
				while(a[2]--) re+='c';
			}
		}
		else 
		{
			while(a[0]--) re+='a';
			while(a[1]--) re+='b';
			while(a[2]--) re+='c';
		}
		for(int i = 3;i<26;i++)
		while(a[i]--) re+=('a'+i);
	
		cout<<re<<'\n';

B

思路

令 c = 1,a从2开始爆搜,必在O(n/2)的时间复杂度解决

		cin>>n;
		k = 1;
		int l = n -1;
		for(int i = 2;i<n;i++)
		if(__gcd(i,n-1-i)==1)
		{
			t = i,m = n-1-i;
			break;
		}
		cout<<t<<' '<<m<<" 1\n";

C

思路

原有的先填坑,对不符合要求的拉出来派个序,按顺序判下未填的是否c[i]>2*i,否的话就不能干break掉

		cin>>n;
		rep(i,1,n) b[i] = 0; k = 0; m = 0;
		rep(i,1,n) {
			cin>>a[i];
			if(a[i]<=n) {
			    if(!b[a[i]])
			    b[a[i]]++;
			    else c[k++] = a[i];
			}
			else c[k++] = a[i];
		}
		
		sort(c,c+k);
		int ok = 0,cnt = 0;;
		rep(i,1,n){
			if(!b[i])
			{
				if(c[m++]>2*i) cnt++;
				else 
				{
					ok = 1;
					break;
				}
			}
		}
		if(ok) cout<<"-1\n";
		else cout<<cnt<<endl;
	}

D

交互题用scanf,printf(小细节,血的教训)

思路

分成连续n/3组查询,必有一组0,或者1,可以证明对这两组查询必能在4次内确定好坏,确定x好y坏后,对剩下的n/3组可以分组在2次查询内确定,总查询次数2n/3+n/3+4 = n+4次

代码(转载)

scanf("%d", &n);
		int x = -1, y = -1;
		for (int i = 0; i < n / 3; i++) {
			printf("? %d %d %d\n", 3 * i + 1, 3 * i + 2, 3 * i + 3);
			fflush(stdout);
			int z;
			scanf("%d", &z);
			if (!z) {
				if (x == -1)
					x = i;
			} else
				if (y == -1)
					y = i;
			c[i] = z;
		}
		printf("? %d %d %d\n", 3 * x + 1, 3 * x + 2, 3 * y + 1);
		fflush(stdout);
		int z1;
		scanf("%d", &z1);
		printf("? %d %d %d\n", 3 * x + 1, 3 * x + 2, 3 * y + 2);
		fflush(stdout);
		int z2;
		scanf("%d", &z2);
		int xx = 0;
		if (!z1 && !z2)
			xx = 3 * x + 1;
		else
			xx = 3 * x + 3;
 
		printf("? %d %d %d\n", 3 * y + 1, 3 * y + 2, 3 * x + 1);
		fflush(stdout);
		scanf("%d", &z1);
		printf("? %d %d %d\n", 3 * y + 1, 3 * y + 2, 3 * x + 2);
		fflush(stdout);
		scanf("%d", &z2);
		int yy = 0;
		if (z1 && z2)
			yy = 3 * y + 1;
		else
			yy = 3 * y + 3;
 
		int cnt = 1;
		a[1] = xx;
		for (int i = 0; i < n / 3; i++)
			if (i != x && i != y) {
				if (!c[i]) {
					printf("? %d %d %d\n", yy, 3 * i + 1, 3 * i + 2);
					fflush(stdout);
					scanf("%d", &z1);
					printf("? %d %d %d\n", yy, 3 * i + 2, 3 * i + 3);
					fflush(stdout);
					scanf("%d", &z2);
					if (!z1)
						if (!z2) 
							a[++cnt] = 3 * i + 1,
							a[++cnt] = 3 * i + 2,
							a[++cnt] = 3 * i + 3;
						else
							a[++cnt] = 3 * i + 1,
							a[++cnt] = 3 * i + 2;
					else
						if (!z2)
							a[++cnt] = 3 * i + 2,
							a[++cnt] = 3 * i + 3;
						else
							a[++cnt] = 3 * i + 1,
							a[++cnt] = 3 * i + 3;
				} else {
					printf("? %d %d %d\n", xx, 3 * i + 1, 3 * i + 2);
					fflush(stdout);
					scanf("%d", &z1);
					printf("? %d %d %d\n", xx, 3 * i + 2, 3 * i + 3);
					fflush(stdout);
					scanf("%d", &z2);
					if (!z1)
						if (!z2) 
							a[++cnt] = 3 * i + 2;
						else
							a[++cnt] = 3 * i + 1;
					else
						if (!z2)
							a[++cnt] = 3 * i + 3;
				}
			} else {
				for (int j = 3 * i + 1; j <= 3 * i + 3; j++)
					if (j != xx && j != yy) {
						printf("? %d %d %d\n", xx, yy, j);
						fflush(stdout);
						scanf("%d", &z1);
						if (!z1)
							a[++cnt] = j;
					}
			}
		printf("! %d", cnt);
		for (int i = 1; i <= cnt; i++)
			printf(" %d", a[i]);
		printf("\n");
		fflush(stdout);
posted @ 2021-12-17 13:39  InsiApple  阅读(19)  评论(0编辑  收藏  举报