Codeforces Round #352 (Div. 1) B. Robin Hood
来源:互联网 发布:淘宝没发票可以投诉吗 编辑:程序博客网 时间:2024/06/01 10:38
We all know the impressive story of Robin Hood. Robin Hood uses his archery skills and his wits to steal the money from rich, and return it to the poor.
There are n citizens in Kekoland, each person hasci coins. Each day, Robin Hood will take exactly1 coin from the richest person in the city and he will give it to the poorest person (poorest person right after taking richest's1 coin). In case the choice is not unique, he will select one among them at random. Sadly, Robin Hood is old and want to retire ink days. He decided to spend these last days with helping poor people.
After taking his money are taken by Robin Hood richest person may become poorest person as well, and it might even happen that Robin Hood will give his money back. For example if all people have same number of coins, then next day they will have same number of coins too.
Your task is to find the difference between richest and poorest persons wealth afterk days. Note that the choosing at random among richest and poorest doesn't affect the answer.
The first line of the input contains two integers n andk (1 ≤ n ≤ 500 000, 0 ≤ k ≤ 109) — the number of citizens in Kekoland and the number of days left till Robin Hood's retirement.
The second line contains n integers, thei-th of them is ci (1 ≤ ci ≤ 109) — initial wealth of the i-th person.
Print a single line containing the difference between richest and poorest peoples wealth.
4 11 1 4 2
2
3 12 2 2
0
Lets look at how wealth changes through day in the first sample.
- [1, 1, 4, 2]
- [2, 1, 3, 2] or [1, 2, 3, 2]
So the answer is 3 - 1 = 2
In second sample wealth will remain the same for each person.
题意:有n个人,每个人有ai个硬币,有个罗宾汉,每天会从最有钱的人那里偷一个硬币给最穷的人,问你k天后最有钱的人比最穷的人多多少钱。
分析:二分出k次之后的硬币最大值和最小值,然后相减。。
#include <cstdio>#include <iostream>using namespace std;long long n,k,tot,MAX,a[500005];int main(){scanf("%d %d",&n,&k);for(int i = 1;i <= n;i++) scanf("%d",&a[i]),tot += a[i],MAX = max(MAX,a[i]);int s = 0,t = tot/n;while(s != t){int mid = (s + t)/2 + 1;long long now = 0;for(int i = 1;i <= n;i++) if(a[i] < mid) now += mid - a[i];if(now > k) t = mid - 1;else s = mid;} int ans1 = s;s = (tot + n - 1)/n,t = MAX;while(s != t){int mid = (s + t)/2;long long now = 0;for(int i = 1;i <= n;i++) if(a[i] > mid) now += a[i] - mid;if(now > k) s = mid + 1;else t = mid;}int ans2 = s;cout<<ans2 - ans1<<endl; }
- Codeforces Round #352 (Div. 1) B. Robin Hood
- Codeforces Round #352 (Div. 1) B. Robin Hood
- Codeforces Round #352 (Div. 1) B. Robin Hood
- Codeforces Round #352 (Div. 2) Robin Hood
- Codeforces Round #352 (Div. 1) B. Robin Hood (以后二分就这么写吧)
- Codeforces Round #352 (Div. 1) B. Robin Hood(想法+二分,好题)
- codeforces 671B /Round #352(div.2) D.Robin Hood 二分
- Codeforces Round #352 (Div. 2) D. Robin Hood
- Codeforces Round #352 (Div. 2) D Robin Hood : 模拟
- CodeForces 671B Robin Hood
- CodeForces Round 352——Recycling Bottles & Robin Hood
- codeforces #352(div1)-Robin Hood
- Codeforces 671B Robin Hood 二分答案
- Codeforces 671B Robin Hood 【思维】
- 【模拟】Codeforces 671B Robin Hood
- Codeforces 671B Robin Hood (二分搜索)
- CodeForces 671 B.Robin Hood(水~)
- Codeforces 672D Robin Hood
- 可修改UID的白卡,请问为什么一般读写器不能修改这种卡的UID,必须要特定的读写器才能修改?
- iOS基础开发-九宫格显示数据页面
- 排序-快速排序(c)
- 【HUSTOJ】1114: 高精度加法之二
- 优化SQL Server数据库的50种方法
- Codeforces Round #352 (Div. 1) B. Robin Hood
- Linux(CentOS)安装SVN服务端
- Codeforces Round #352 (Div. 1) A. Recycling Bottles
- Android 引入aar相关问题
- 【Qt】标准颜色对话框类
- 关于HashSet与HashMap
- iOS开发设置textFiled的placeholder颜色
- Activity四种启动模式
- 常量字符串为什么位于静态存储区?