Rin and The Unknown Flower 题解
我们发现题目\(\frac{1}{t^2}\)和总情况数\(3^t\)在\(t=2\)的时候乘积最小,这启发我们查询长度为\(2\)的串,我们可以查询\(CC,CH,CO,HO,OO\),前三个可以使得\(1 \le i \le n-1\)中\(s_i=C\)的都确定,而后三个可以使\(2 \le i \le n\)中\(s_i=O\)的都确定,容易发现\(2 \le i \le n-1\)中未确定的都是\(H\),然后前后未确定的手玩一下发现只有\(4\)种情况,只用询问\(3\)次,贡献为\(\frac{5}{4}+\frac{3}{n^2}\),在\(n \ge 5\)的时候成立,容易发现\(n == 4\)的时候情况不多,手玩一下分类讨论即可,具体见代码。(有点长…………)
#include <bits/stdc++.h>
using namespace std;
const int maxn=100;
int T,n,a[maxn],x,y,op,tp,st[maxn];
inline void write(){
for(int i=1;i<=n;i++){
if(a[i]==1){
cout<<"C";
}
else if(a[i]==2){
cout<<"H";
}
else{
cout<<"O";
}
}
cout<<endl;
return;
}
signed main(){
cin>>T;
while(T--){
cin>>n;
for(int i=1;i<=n;i++){
a[i]=0;
}
if(n>4){
cout<<"? CC"<<endl;
cin>>x;
while(x--){
cin>>y;
a[y]=1;
a[y+1]=1;
}
cout<<"? CH"<<endl;
cin>>x;
while(x--){
cin>>y;
a[y]=1;
a[y+1]=2;
}
cout<<"? CO"<<endl;
cin>>x;
while(x--){
cin>>y;
a[y]=1;
a[y+1]=3;
}
cout<<"? HO"<<endl;
cin>>x;
while(x--){
cin>>y;
a[y]=2;
a[y+1]=3;
}
cout<<"? OO"<<endl;
cin>>x;
while(x--){
cin>>y;
a[y]=3;
a[y+1]=3;
}
for(int i=2;i<n;i++){
if(!a[i]){
a[i]=2;
}
}
if(a[1]==0&&a[n]==0){
a[1]=2;
a[n]=1;
cout<<"? ";
write();
cin>>x;
if(!x){
a[1]=2;
a[n]=2;
cout<<"? ";
write();
cin>>x;
if(!x){
a[1]=3;
a[n]=1;
cout<<"? ";
write();
cin>>x;
if(!x){
a[1]=3;
a[n]=2;
}
else{
cin>>y;
}
}
else{
cin>>y;
}
}
else{
cin>>y;
}
}
else if(a[1]==0){
a[1]=2;
cout<<"? ";
write();
cin>>x;
if(!x){
a[1]=3;
}
else{
cin>>y;
}
}
else if(a[n]==0){
a[n]=1;
cout<<"? ";
write();
cin>>x;
if(!x){
a[n]=2;
}
else{
cin>>y;
}
}
cout<<"! ";
write();
}
else{
cout<<"? CC"<<endl;
cin>>x;
while(x--){
cin>>y;
a[y]=1;
a[y+1]=1;
}
cout<<"? CH"<<endl;
cin>>x;
while(x--){
cin>>y;
a[y]=1;
a[y+1]=2;
}
cout<<"? CO"<<endl;
cin>>x;
while(x--){
cin>>y;
a[y]=1;
a[y+1]=3;
}
tp=0;
for(int i=1;i<=4;i++){
if(a[i]==0){
tp++;
st[tp]=i;
}
}
if(tp==1){
a[st[tp]]=1;
cout<<"? ";
write();
cin>>x;
if(!x){
a[st[tp]]=2;
cout<<"? ";
write();
cin>>x;
if(!x){
a[st[tp]]=3;
}
else{
cin>>y;
}
}
else{
cin>>y;
}
}
else if(tp==2){
a[st[1]]=2;
a[st[2]]=1;
cout<<"? ";
write();
cin>>x;
if(!x){
a[st[1]]=2;
a[st[2]]=2;
cout<<"? ";
write();
cin>>x;
if(!x){
a[st[1]]=2;
a[st[2]]=3;
cout<<"? ";
write();
cin>>x;
if(!x){
a[st[1]]=3;
a[st[2]]=1;
cout<<"? ";
write();
cin>>x;
if(!x){
a[st[1]]=3;
a[st[2]]=2;
cout<<"? ";
write();
cin>>x;
if(!x){
a[st[1]]=3;
a[st[2]]=3;
}
else{
cin>>y;
}
}
else{
cin>>y;
}
}
else{
cin>>y;
}
}
else{
cin>>y;
}
}
else{
cin>>y;
}
}
else if(tp!=0){
cout<<"? HO"<<endl;
cin>>x;
while(x--){
cin>>y;
a[y]=2;
a[y+1]=3;
}
tp=0;
for(int i=1;i<=4;i++){
if(a[i]==0){
tp++;
st[tp]=i;
}
}
if(tp==2){
a[st[1]]=2;
a[st[2]]=1;
cout<<"? ";
write();
cin>>x;
if(!x){
a[st[1]]=2;
a[st[2]]=2;
cout<<"? ";
write();
cin>>x;
if(!x){
a[st[1]]=2;
a[st[2]]=3;
cout<<"? ";
write();
cin>>x;
if(!x){
a[st[1]]=3;
a[st[2]]=1;
cout<<"? ";
write();
cin>>x;
if(!x){
a[st[1]]=3;
a[st[2]]=2;
cout<<"? ";
write();
cin>>x;
if(!x){
a[st[1]]=3;
a[st[2]]=3;
}
else{
cin>>y;
}
}
else{
cin>>y;
}
}
else{
cin>>y;
}
}
else{
cin>>y;
}
}
else{
cin>>y;
}
}
else if(tp!=0){
cout<<"? OO"<<endl;
cin>>x;
while(x--){
cin>>y;
a[y]=3;
a[y+1]=3;
}
tp=0;
for(int i=1;i<=n;i++){
if(a[i]==0){
tp++;
st[tp]=i;
}
}
if(tp==1){
a[st[tp]]=1;
cout<<"? ";
write();
cin>>x;
if(!x){
a[st[tp]]=2;
}
else{
cin>>y;
}
}
else if(tp==2){
a[3]=2;
a[4]=1;
cout<<"? ";
write();
cin>>x;
if(!x){
a[4]=2;
}
else{
cin>>y;
}
}
else if(tp!=0){
a[2]=2;
a[3]=2;
cout<<"? HHH"<<endl;
cin>>x;
while(x--){
cin>>y;
a[y]=2;
a[y+1]=2;
a[y+2]=2;
}
if(!a[1]){
a[1]=3;
}
if(!a[4]){
a[4]=1;
}
}
}
}
cout<<"! ";
write();
}
cin>>op;
if(op==0){
return 0;
}
}
return 0;
}
浙公网安备 33010602011771号