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);
本文来自博客园,作者:InsiApple,转载请注明原文链接:https://www.cnblogs.com/InsiApple/p/15701942.html