经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
cf1088D. Ehab and another another xor problem(思维)
来源:cnblogs  作者:自为风月马前卒  时间:2018/12/7 9:33:34  对本文有异议

题意

题目链接

系统中有两个数\((a, b)\),请使用\(62\)以内次询问来确定出\((a, b)\)

每次可以询问两个数\((c, d)\)

\(a \oplus c > b \oplus d\)返回\(1\)

\(a \oplus c = b \oplus d\)返回\(0\)

\(a \oplus c < b \oplus d\)返回\(-1\)

保证/需要保证\(0 \leqslant a, b, c, d, < 2^{30}\)

Sol

严重怀疑自己小学数学没学好,刚开始以为\(a, b, c, d < 2^{30}\)说明每位只有两次机会,然后模拟了\(4 * 4 * 3\)种情况后发现怎么都搞不了,今天看std发现是每位询问两次后还有额外的两次询问机会qwqqqqq

如果多两次机会的话就能搞了,因为我打比赛的时候遇到的问题就是如何确定出当前两位和除去这两位之后的大小关系。这样我们可以上来先询问出\((a, b)\)的大小关系,然后xjb特判一下。。

标算好神仙啊。。

  1. #include<bits/stdc++.h>
  2. #define Pair pair<int, int>
  3. #define MP(x, y) make_pair(x, y)
  4. #define fi first
  5. #define se second
  6. //#define int long long
  7. #define LL long long
  8. #define rg register
  9. #define pt(x) printf("%d ", x);
  10. #define Fin(x) {freopen(#x".in","r",stdin);}
  11. #define Fout(x) {freopen(#x".out","w",stdout);}
  12. using namespace std;
  13. const int MAXN = 1e6 + 10, INF = 1e9 + 10, mod = 1e9 + 7;
  14. const double eps = 1e-9;
  15. int Query(int c, int d) {
  16. printf("? %d %d\n", c, d); fflush(stdout);
  17. int opt; scanf("%d", &opt); return opt;
  18. }
  19. int a, b, flag, B = 29;
  20. main() {
  21. flag = Query(0, 0);
  22. for(int i = B; i >= 0; i--) {
  23. int x = Query(a | (1 << i), b), y = Query(a, b | (1 << i));
  24. if(x == y) {
  25. if(flag == 1) a |= (1 << i);
  26. else b |= (1 << i);
  27. flag = x;
  28. } else if(x == -1) {
  29. a |= (1 << i);
  30. b |= (1 << i);
  31. }
  32. }
  33. printf("! %d %d", a, b);
  34. return 0;
  35. }
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号