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

本文共 1467 字,大约阅读时间需要 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;}

转载于:https://www.cnblogs.com/mengfanrong/p/4294503.html

你可能感兴趣的文章
C#设置本地网络(DNS、网关、子网掩码、IP)
查看>>
Oracle数据库查看表空间是否为自增的
查看>>
asp.net图片浏览器效果
查看>>
BZOJ.5249.[九省联考2018]iiidx(贪心 线段树)
查看>>
HDU.4903.The only survival(组合 计数)
查看>>
C/C++中extern关键字详解
查看>>
内部类的用法
查看>>
python自动华 (十四)
查看>>
Spring MVC环境中的文件上传功能实现
查看>>
Weblogic禁用SSLv3和RC4算法教程
查看>>
jackson 解析json问题
查看>>
Java中getResourceAsStream的用法
查看>>
Lintcode: Hash Function && Summary: Modular Multiplication, Addition, Power && Summary: 长整形long...
查看>>
import static
查看>>
vue2留言板
查看>>
。。。。
查看>>
Vue报错:Uncaught RangeError: Maximum call stack size exceeded
查看>>
Struts2中action接收参数的三种方法及ModelDriven跟Preparable接口结合JAVA反射机制的灵活用法...
查看>>
react-draft-wysiwyg富文本
查看>>
echarts - 条形图grid设置距离绘图区域的距离
查看>>