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;
}
posted @ 2025-06-01 09:38  特别之处  阅读(14)  评论(0)    收藏  举报