题目大意 :初始有n个数字,其中有一个是会变的数字,也就是我们要找的数字,每次操作可以选择删除任意个数字(或者不删),但是删除了要找的数字会直接失败,之后要找的数字有可能变成其他数字,但最多两次操作后,它一定会发生变化,要求在最多5次操作后,找出变化数字的位置。
1<=t<=1000;2<=n<=200;1<=ai<=9
思路:如果某一个数字发生了变化,那么我们可以通过维护每个数字的数量的方式,很容易找到,哪个数字数量变多了,它就变成了哪个数字,所以我们在它发生变化前不动,变化后把没变的都删了,经过两轮操作后便只剩下了那个会变化的数字,操作次数正好最多5次
//#include<__msvc_all_public_headers.hpp>
#include<bits/stdc++.h>
using namespace std;
int cnt[15];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
cin >> t;
while (t--)
{
for (int i = 1; i <= 9; i++)
{
cnt[i] = 0;
}
int n;
cin >> n;
for (int i = 1; i <= n; i++)
{
int x;
cin >> x;
cnt[x]++;//记录每个数字的个数,
}
vector<int>cnt2(10);
cout << "- 0" << endl;//先不动,等待数字发生变化
cout.flush();
vector<int>a(201);
for (int i = 1; i <= n; i++)
{
cin >> a[i];
cnt2[a[i]]++;
}
int temp = 0;
for (int i = 1; i <= 9; i++)
{
if (cnt[i] == cnt2[i]-1)
{//有数字的数量发生了变化
temp = i;
break;
}
}
if (!temp)
{
vector<int>cnt3(10);
cout << "- 0" << endl;//一次没变就再等它一次
cout.flush();
for (int i = 1; i <= n; i++)
{
cin >> a[i];
cnt3[a[i]]++;
}
for (int i = 1; i <= 9; i++)
{
if (cnt[i] == cnt3[i]-1)
{
temp = i;
break;
}
}
}
vector<int>out;
for (int i = 1; i <= n; i++)
{
if (a[i] != temp)
{
out.push_back(i);//把与当前变多的数字不同的数字全部删掉
}
}
int mi = out.size();
cout << "- " << mi << " ";
for (int i = 0; i < mi; i++)
{
cout << out[i] << " ";
}
cout << endl;
cout.flush();
n -= mi;
int ans = 0;
for (int i = 1; i <= n; i++)
{
int x;
cin >> x;
if (x != temp)
{//如果再产生不一样的数字,那它就是会变化的那个
ans = i;
}
}
if (ans)
{
cout << "! " << ans << endl;
cout.flush();
continue;
}
cout << "- 0" << endl;//没变化就再等一轮
cout.flush();
for (int i = 1; i <= n; i++)
{
int x;
cin >> x;
if (x != temp)
{
ans = i;
}
}
cout << "! " << ans << endl;
cout.flush();
}
return 0;
}