题意:

交互题

题目输入一个n,你需要输出一个满足要求的[1,n]的排列。

你可以最多询问2*n次来确定你要输出的排列·中每一个位置的值

每一次询问格式为“? a b”

它会回复你答案排列中第a个位置的元素取余于第b个位置的元素的值是多少

题解:

因为最后答案中每一个元素只会使用一次,那么你询问的va,vb肯定一个大一个小(v数组代表最后我们要输出的答案数组)

那么你用一个min(va,vb)%max(va,vb)==min(va,vb)

可以说两次询问可以确定一个元素的大小

那么就可以写代码了

代码:

int a[maxn];
void ask(int i,int j) {
cout << "?" << " " << i << " " << j << endl;
fflush(stdout);
}
int main() {
int n;cin >> n;
if(n == 1) {
cout << "! 1" << endl;
fflush(stdout);
exit(0);
}
int id = 0;
int x,y;
ask(1,2);
cin >> x;
ask(2,1);
cin >> y;
if(x > y) {
a[1] = x;
id = 1;
} else {
a[2] = y;
id = 2;
}
if(n == 2) {
if(id == 1) cout << "! " << a[1] << " " << (3 - a[1]) << endl;
else cout << "! " << (3 - a[2]) << " " << a[2] << endl;
fflush(stdout);
return 0;
}
if(id == 1) id = 2; else id = 1;
for(int i = 3;i <= n;++i) {
if(a[i] != 0) continue;
x = 0,y = 0;
ask(id,i);cin >> x;
ask(i,id);cin >> y;
if(x > y) {
a[id] = x;
id = i;
} else {
a[i] = y;
}
}
a[id] = n;
cout << "!";
for(int i = 1;i <= n;++i) {
cout << " " << a[i];
}
cout << endl;
fflush(stdout);
return 0;
}

最新文章

  1. MongoDB安装使用
  2. EditText的hint不显示
  3. samtools常用命令详解(转)
  4. PMP项目管理笔记 项目定义
  5. Socket通信(转)
  6. windows服务与桌面交互
  7. 关于overflow-y:scroll ios设备不流畅的问题
  8. Pgsql 里面 COALESCE的用法
  9. js监控键盘大小写事件
  10. 【转】Linux下tar.xz结尾的文件的解压方法
  11. css Tab选项卡1
  12. C#winform自定义控件模拟设计时界面鼠标移动和调节大小、选中效果
  13. 下载、安装 SQL server 2012,一步一步教你安装、激活sql server2012数据库 ,附有数据库安装包
  14. 《SQL 基础教程》第二章:查询基础
  15. immutable-styles 基本试用
  16. centos7 Apache 2.4.6 多域名多网站配置
  17. 腾讯游戏设计(tgideas.qq.com)回复处CSRF任意换马甲
  18. 修改XML的节点内容
  19. 使用TCP在同一台电脑上可以建立连接,在两台电脑上却连接失败的原因分析
  20. CentOS6下docker的安装和使用

热门文章

  1. aix5.3安装httpd服务
  2. centos 安装 部署 gitlab github
  3. Java并发/多线程-CAS原理分析
  4. k8s集群中遇到etcd集群故障的排查思路
  5. MYSQL基础知识的复习2
  6. 使用Canal作为mysql的数据同步工具
  7. cfsetispeed、cfsetospeed和cfsetspeed探究
  8. 笔记 | 吴恩达新书《Machine Learning Yearning》
  9. 纯手工撸一个vue框架
  10. (Mysql)连接问题之1130