记录一下第一次写交互题

题目大意:一共有1<<n个人参加一场竞标赛,需要你通过比较两人的胜场来判断谁晋级,最终获得第一名

 最多1/3*2^(n+1)次询问,每次询问query(a,b),如果a胜场多返回1,如果b胜场多返回2,相同胜场返回0

 找到冠军后输出“! i”(i为冠军的编号)

思路:

  每次取四个人一组,因为如果这一组人进行了t轮比赛后,最终有一人胜出,那么他们的胜场将为

  [ t , t , t+1 , t+2 ],而且 t 和 t 不能出现在同一组,那么他们的胜场排列基本如下[ t , t+1       t , t+2 ]

  所以先对奇数进行查询(query(a[i],a[i+2])),如果相同(t==0),说明他们俩同时被淘汰,此时只用比较偶数组,谁多谁胜出

  否则如果不同,若返回1,说明a[i]为t+1或者t+2,这时只用比较a[i]与a[i+3]即可

  同理返回2

 1 # include<iostream>
2 # include<bits/stdc++.h>
3 using namespace std;
4 # define int long long
5
6 int ask(int a, int b) {
7 cout << "? " << a << ' ' << b << endl;
8 int t;
9 cin >> t;
10 return t;
11 }
12 int tt;
13 signed main() {
14 ios::sync_with_stdio(0);
15 cin.tie(0);
16 cout.tie(0);
17 cin >> tt;
18 while (tt--) {
19 int n;
20 cin >> n;
21 vector<int> a;
22 n = 1 << n;
23 for (int i = 1; i <= n; ++i) {
24 a.push_back(i);
25 }
26 while (n >= 4) {
27 vector<int> b;
28 for (int i = 0; i < n; i += 4) {
29 int t = ask(a[i], a[i + 2]);
30 if (t == 0) {
31 int t2 = ask(a[i + 1], a[i + 3]);
32 if (t2 == 1) b.push_back(a[i + 1]);
33 else b.push_back(a[i + 3]);
34 } else if (t == 1) {
35 int t2 = ask(a[i], a[i + 3]);
36 if (t2 == 1) b.push_back(a[i]);
37 else b.push_back(a[i + 3]);
38 } else {
39 int t2 = ask(a[i + 1], a[i + 2]);
40 if (t2 == 1) b.push_back(a[i + 1]);
41 else b.push_back(a[i + 2]);
42 }
43 }
44 n /= 4;
45 a.swap(b);
46 }
47 if (a.size() == 2) {
48 int t = ask(a[0], a[1]);
49 if (t == 1) cout << '!' << ' ' << a[0] << endl;
50 else cout << '!' << ' ' << a[1] << endl;
51 } else cout << '!' << ' ' << a[0] << endl;
52
53 }
54
55
56 return 0;
57 }

Codeforces Round #812 (Div. 2) D. Tournament Countdown(交互题)的更多相关文章

  1. Codeforces Round #371 (Div. 2) D. Searching Rectangles 交互题 二分

    D. Searching Rectangles 题目连接: http://codeforces.com/contest/714/problem/D Description Filya just lea ...

  2. Codeforces Round #367 (Div. 2) A. Beru-taxi (水题)

    Beru-taxi 题目链接: http://codeforces.com/contest/706/problem/A Description Vasiliy lives at point (a, b ...

  3. Codeforces Round #575 (Div. 3) 昨天的div3 补题

    Codeforces Round #575 (Div. 3) 这个div3打的太差了,心态都崩了. B. Odd Sum Segments B 题我就想了很久,这个题目我是找的奇数的个数,因为奇数想分 ...

  4. Codeforces Round #334 (Div. 2) A. Uncowed Forces 水题

    A. Uncowed Forces Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/604/pro ...

  5. Codeforces Round #443 (Div. 1) C. Tournament

    题解: 思路挺简单 但这个set的应用好厉害啊.. 我们把它看成图,如果a存在一门比b大,那么a就可以打败b,a——>b连边 然后求强联通分量之后最后顶层的强联通分量就是能赢的 但是因为是要动态 ...

  6. Codeforces Round #812 (Div. 2) E(并查集)

    种类并查集:定义种类之间的关系来判断操作是否进行 题目大意:对于题目给出的一个矩阵,我们可以进行一种操作:swap(a[i][j],a[j][i]) 使得矩阵可以变换为字典序最小的矩阵 思路: 通过扫 ...

  7. Codeforces Round #327 (Div. 2) A. Wizards' Duel 水题

    A. Wizards' Duel Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/591/prob ...

  8. Codeforces Round #303 (Div. 2) A. Toy Cars 水题

     A. Toy Cars Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/545/problem ...

  9. Codeforces Round #146 (Div. 1) A. LCM Challenge 水题

    A. LCM Challenge 题目连接: http://www.codeforces.com/contest/235/problem/A Description Some days ago, I ...

随机推荐

  1. Android序列化的几种实现方式

    一.Serializable序列化 Serializable是java提供的一种序列化方式,其使用方式非常简单,只需要实现Serializable接口就可以实现序列化. public interfac ...

  2. sql报错收集

    踩坑记录: 当出现如下错误 Not enough parameters for the SQL statement 多半是因为插入时填写的字段名有误 json.decoder.JSONDecodeEr ...

  3. openstack中Keystone组件简解

    一.Keystone服务概述 在Openstack框架中,keystone(Openstack Identity Service)的功能是负责验证身份.校验服务规则和发布服务令牌的,它实现了Opens ...

  4. Thrift RPC改进—更加准确的超时管理

    前言: 之前我们组内部使用Thrift搭建了一个小型的RPC框架,具体的实现细节可以参考我之前的一篇技术文章:https://www.cnblogs.com/kaiblog/p/9507642.htm ...

  5. IK分词器实现原理剖析 —— 一个小问题引发的思考

    前言: 网上很多的文章都建议在使用IK分词器的时候,建立索引的时候使用ik_max_word模式:搜索的时候使用ik_smart模式.理由是max_word模式分词的结果会包含smart分词的结果,这 ...

  6. 云原生之旅 - 2)Docker 容器化你的应用

    前言 上文中我们用Golang写了一个HTTP server,本篇文章我们讲述如何容器化这个应用,为后续部署到kubernetes 做准备. 关键词:Docker, Containerization, ...

  7. ProxySQL 匹配规则

    现实中很多场景要求更新数据能立马查到数据,而主从同步在这方面无解,所以从规则上修改,一些需要及时查询的语句在主上. # 用户登录 mysql -h192.168.0.103 -P16032 -urad ...

  8. k8s控制器理解

    DaemonSet 一个DaemonSet对象能确保其创建的Pod在集群中的每一台(或指定)Node上都运行一个副本.如果集群中动态加入了新的Node,DaemonSet中的Pod也会被添加在新加入N ...

  9. MySQL手动恢复数据库测试操作

    事件背景 MySQL数据库每日零点自动全备 某天上午9点,二狗子不小心drop了一个数据库 我们需要通过全备的数据文件,以及增量的binlog文件进行数据恢复 主要思想与原理 利用全备的sql文件中记 ...

  10. Mysql三种日志(binlog,redolog,undolog)的作用和区别

    Mysql有三种很重要的日志也是面试经常涉及到的考点,分别是 binlog .redo log和undo log, 这里面binlog 是server层实现的日志,而redo log 和undo lo ...