博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU5014Number Sequence(贪心)
阅读量:5732 次
发布时间:2019-06-18

本文共 1401 字,大约阅读时间需要 4 分钟。

HDU5014Number Sequence(贪心)

题目大意:

给出n,然后给出一个数字串,长度为n + 1, 范围在[0, n - 1].然后要求你找出另外一个序列B,满足上述的要求,而且使得t = A0^B0 + Ai + 1 ^ Bi + 1 + ... + An ^ Bn 最大。

解题思路:

对于一个数字进行异或,要求结果最大的话,那么取这个数字的二进制互补数字是最好的情况,而且能够发现每次找到一个数字和相应的互补的数字都会是一段区间。就这样一段一段区间的去寻找每一个点相应的最好的匹配点。

代码:

#include 
#include
typedef long long ll;const int N = 1e5 + 5;const int M = 20;int num[N];int Map[N];int n;ll t[M];void init () { t[0] = 1; for (int i = 1; i <= M; i++) t[i] = t[i - 1] * 2;}int main () { init(); while (scanf ("%d", &n) == 1) { for (int i = 0; i <= n; i++) scanf ("%d", &num[i]); int rear = n; int front; ll ans = 0;// printf ("%lld\n", t[M - 1]); while (rear >= 0) { for (int i = 0; i < M; i++) if (t[i] > rear) { front = t[i] - rear - 1; break; } for (int i = 0; i < (rear - front + 1) / 2; i++) { Map[rear - i] = front + i; Map[front + i] = rear - i; } if (rear == front) Map[rear] = front; rear = front - 1; } for (int i = 0; i <= n; i++) ans += num[i] ^ Map[num[i]]; printf ("%lld\n", ans); for (int i = 0; i < n; i++) printf("%d ", Map[num[i]]); printf ("%d\n", Map[num[n]]); } return 0;}

转载地址:http://mklwx.baihongyu.com/

你可能感兴趣的文章
C++中const用法总结
查看>>
Java基础加强-代理
查看>>
Arduino和C51开发光敏传感器
查看>>
java_泛型方法使用实例
查看>>
guava cache简单学习笔记
查看>>
选课系统
查看>>
无线电导航
查看>>
run-sequence
查看>>
大聊Python----SocketServer
查看>>
Hadoop 面试题 之Hive
查看>>
解决pycharm问题:module 'pip' has no attribute 'main'
查看>>
使用Python求解水仙花问题
查看>>
做市商制度
查看>>
zencart根据configuration_id cID查找站点配置
查看>>
Debug与Release版本的区别
查看>>
CoreText.framework(转)
查看>>
Selenium:元素等待的4种方法
查看>>
如何写出好的产品需求文档
查看>>
哈夫曼树对文件进行译码
查看>>
Quartz任务调度
查看>>