题解:CF1896G Pepe Racing
主要思路:构造。
思路
方法一
一个一个的找,分别查询
方法二
找第二快的人,只有最快的人在的一组需重新询问,剩下答案无需改变。需排除的人的一组用不是现在任何一组最大值的东西来补空位。这样询问总次数达到
方法三
明显的方法而仍与题目要求差
当只剩下
在补充元素的时候,并不真的把元素补进去,而是在求
这样询问次数就到达了
AC Code
#include<bits/stdc++.h>
using namespace std;
const int N = 405;
int n, ans[N], vis[405];
set<int>s[N];
vector<int>asn;
inline int ask(set<int>&s) {
cout << "? ";
for (auto x : s)cout << x << " ";
cout << "\n";
int ret;
cin >> ret;
return ret;
}
inline get(set<int>&s) {
int tot = 1;
for (int i = n - s.size(); i; i--) {
while (vis[tot] || s.find(tot) != s.end())tot++;
s.insert(tot);
}
}
inline void solve() {
cin >> n;
for (int i = 0; i <= n * n + 1; i++)vis[i] = 0, ans[i] = 0, s[i].clear();
asn.clear();
for (int i = 1; i <= n; i++) {
for (int j = (i - 1) * n + 1; j <= i * n; j++)s[i].insert(j);
ans[i] = ask(s[i]), vis[ans[i]] = 1;
}
for (int tot = n * n; tot >= 2 * n; tot--) {
set<int>now;
for (int i = 1; i <= n; i++)now.insert(ans[i]);
get(now);
int x = ask(now), id = 0;
for (int i = 1; i <= n; i++)if (ans[i] == x)id = i;
asn.push_back(x);
s[id].erase(x);
get(s[id]);
ans[id] = ask(s[id]);
vis[ans[id]] = 1;
for (int i = 1; i <= n; i++)if (i != id)s[i].erase(ans[id]);
}
set<int>now;
for (int i = 1; i <= n; i++)now.insert(ans[i]);
get(now);
for (int tot = n - 1; tot; tot--) {
int x = ask(now);
now.erase(x);
get(now);
asn.push_back(x);
}
for (auto x : now)if (vis[x])asn.push_back(x);
cout << "! ";
for (auto x : asn)cout << x << " ";
cout << endl;
}
int t;
int main() {
cin >> t;
while (t--) solve();
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)