Codeforces Round #352 (Div. 2) D. Robin Hood (二分答案)
2016-05-16 15:27
477 查看
题目链接:http://codeforces.com/contest/672/problem/D
有n个人,k个操作,每个人有a[i]个物品,每次操作把最富的人那里拿一个物品给最穷的人,问你最后贫富差距有多少。
先sort一下,最富的人很明显不会低于sum(a1 ~ an) / n , 所以二分一下最富人的最小值 看是否满足操作k。
最穷的人不会高于sum(a1 ~ an) / n + 1 ,所以二分一下最穷人的最大值 看是否满足操作k。
(注意一点的是二分以后最穷的人的最大值和最富的人的最小值要是相同,那么要讨论一下总和是否被n整除的情况,要是整除那么差距就为0,否则就为1。)
有n个人,k个操作,每个人有a[i]个物品,每次操作把最富的人那里拿一个物品给最穷的人,问你最后贫富差距有多少。
先sort一下,最富的人很明显不会低于sum(a1 ~ an) / n , 所以二分一下最富人的最小值 看是否满足操作k。
最穷的人不会高于sum(a1 ~ an) / n + 1 ,所以二分一下最穷人的最大值 看是否满足操作k。
(注意一点的是二分以后最穷的人的最大值和最富的人的最小值要是相同,那么要讨论一下总和是否被n整除的情况,要是整除那么差距就为0,否则就为1。)
#include <bits/stdc++.h> using namespace std; const int MAXN = 5e5 + 10; typedef long long LL; LL a[MAXN], n; //最穷人的的最大值 bool check_min(LL x, LL k) { LL cnt = upper_bound(a + 1, a + n + 1, x) - a; for(int i = 1; i <= cnt - 1; ++i) { k -= (x - a[i]); if(k < 0) return false; } return true; } bool check_max(LL x , LL k) { LL cnt = upper_bound(a + 1, a + n + 1, x) - a; for(int i = cnt; i <= n; ++i) { k -= (a[i] - x); if(k < 0) return false; } return true; } int main() { LL k , sum = 0; scanf("%lld %lld", &n, &k); for(int i = 1; i <= n; ++i) { scanf("%lld", a + i); sum += a[i]; } sort(a + 1, a + n + 1); if(a[1] == a ) { printf("0\n"); return 0; } LL l = a[1], r = sum / n + 1, L = a[1], R = a ; while(l < r) { //最穷人的的最大值 LL mid = (l + r) >> 1; if(check_min(mid, k)) { l = mid + 1; L = mid; } else r = mid; } l = sum / n, r = a ; while(l < r) { LL mid = (l + r) >> 1; if(check_max(mid, k)) { r = mid; R = r; } else l = mid + 1; } printf("%lld\n", R > L? R - L: (sum % n ? 1 : 0)); }
相关文章推荐
- OC语言笔记(七):OC字符串Json、plist、NSNumber和NSValue、KVC
- 新闻类list,支持两种不同的item
- nohup linux 运行不了
- HDU 4685 Prince and Princess 二分图匹配+tarjan
- mvc4异步上传文件
- cocos2dx3.x 导出自定义事件到lua的方法
- java设计模式:代理模式
- linux下搭建一台属于自己的DNS服务器
- 阐述一下线程与进程的区别
- 阅读项目,写出执行结果4
- OC语言笔记(六):OC单例、NSData和文件操作
- 生成网站快捷方式
- ACE框架整合记录5tooltip插件-【完结】
- MySQL——死锁
- 网络层概念学习之一(基本概念、路由器、选路算法)
- 动态规划交错匹配问题
- 理解JS中的prototype
- Haproxy+MYSQL 负载均衡 原创
- [转] 在React Native中使用ART
- 模仿系统自带的集拍照,录制视频,以及iphone6S以下的手机拍摄livephoto照片(livephoto),滑动可切换