题目链接: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。)

 #include <bits/stdc++.h>
using namespace std;
const int MAXN = 5e5 + ;
typedef long long LL;
LL a[MAXN], n;
//最穷人的的最大值
bool check_min(LL x, LL k) {
LL cnt = upper_bound(a + , a + n + , x) - a;
for(int i = ; i <= cnt - ; ++i) {
k -= (x - a[i]);
if(k < )
return false;
}
return true;
} bool check_max(LL x , LL k) {
LL cnt = upper_bound(a + , a + n + , x) - a;
for(int i = cnt; i <= n; ++i) {
k -= (a[i] - x);
if(k < )
return false;
}
return true;
} int main()
{
LL k , sum = ;
scanf("%lld %lld", &n, &k);
for(int i = ; i <= n; ++i) {
scanf("%lld", a + i);
sum += a[i];
}
sort(a + , a + n + );
if(a[] == a[n]) {
printf("0\n");
return ;
}
LL l = a[], r = sum / n + , L = a[], R = a[n];
while(l < r) { //最穷人的的最大值
LL mid = (l + r) >> ;
if(check_min(mid, k)) {
l = mid + ;
L = mid;
}
else
r = mid;
}
l = sum / n, r = a[n];
while(l < r) {
LL mid = (l + r) >> ;
if(check_max(mid, k)) {
r = mid;
R = r;
}
else
l = mid + ;
}
printf("%lld\n", R > L? R - L: (sum % n ? : ));
}

Codeforces Round #352 (Div. 2) D. Robin Hood (二分答案)的更多相关文章

  1. Codeforces Round #352 (Div. 1) B. Robin Hood 二分

    B. Robin Hood 题目连接: http://www.codeforces.com/contest/671/problem/B Description We all know the impr ...

  2. Codeforces Round #352 (Div. 2) D. Robin Hood 二分

    D. Robin Hood   We all know the impressive story of Robin Hood. Robin Hood uses his archery skills a ...

  3. Codeforces 671B/Round #352(div.2) D.Robin Hood 二分

    D. Robin Hood We all know the impressive story of Robin Hood. Robin Hood uses his archery skills and ...

  4. Codeforces Round #352 (Div. 1) B. Robin Hood (二分)

    B. Robin Hood time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  5. Codeforces Round #352 (Div. 1) B. Robin Hood

    B. Robin Hood 讲道理:这种题我是绝对不去(敢)碰的.比赛时被这个题坑了一把,对于我这种不A不罢休的人来说就算看题解也要得到一个Accepted. 这题网上有很多题解,我自己是很难做出来的 ...

  6. Codeforces Round #352 (Div. 2) D. Robin Hood

    题目链接: http://codeforces.com/contest/672/problem/D 题意: 给你一个数组,每次操作,最大数减一,最小数加一,如果最大数减一之后比最小数加一之后要小,则取 ...

  7. Codeforces Round #352 (Div. 2) ABCD

    Problems     # Name     A Summer Camp standard input/output 1 s, 256 MB    x3197 B Different is Good ...

  8. Codeforces Round #352 (Div. 2)

    模拟 A - Summer Camp #include <bits/stdc++.h> int a[1100]; int b[100]; int len; void init() { in ...

  9. Codeforces Round #352 (Div. 2) (A-D)

    672A Summer Camp 题意: 1-n数字连成一个字符串, 给定n , 输出字符串的第n个字符.n 很小, 可以直接暴力. Code: #include <bits/stdc++.h& ...

随机推荐

  1. Web内容管理系统 Magnolia 安装使用-挖掘优良的架构(2)

    在Windows上安装社区版  tomcat集成版 Magnolia CMS社区版本为免费发行,不需要任何GNU通用公共许可协议(第3版)条款下的授权(这个许可协议允许您在特定条款和条件下,重新分配和 ...

  2. SFMPQ打包工具完后小结

    硬盘上没有,第一次创建Archive的时候用SFileOpenArchiveForUpdate, 当打开一个已经存在archive的时候用SFileOpenArchive. MpqDeleteFile ...

  3. 【Todo】淘宝十年产品事-读书笔记

    书籍位置: /Users/baidu/Documents/Data/Interview/业界/淘宝十年产品事.pdf

  4. Qt之QuaZIP(zip压缩/解压缩)

    简述 QuaZIP是使用Qt/C++对ZLIB进行简单封装的用于压缩及解压缩ZIP的开源库.适用于多种平台,利用它可以很方便的将单个或多个文件打包为zip文件,且打包后的zip文件可以通过其它工具打开 ...

  5. Android Configuration change引发的问题及解决方法(转)

    之前在学习Fragment和总结Android异步操作的时候会在很多blog中看到对Configuration Change的讨论,以前做的项目都是固定竖屏的,所以对横竖屏切换以及横竖屏切换对程序有什 ...

  6. Java [Leetcode 202]Happy Number

    题目描述: Write an algorithm to determine if a number is "happy". A happy number is a number d ...

  7. 【C#学习笔记】结构体使用

    using System; namespace ConsoleApplication { struct _st { public string name; public int age; } clas ...

  8. Linux常用设置

    1.文件夹操作 创建-->mkdir NAME 删除-->rm NAME -i 删除前逐一询问确认 -f 直接删除,不确认 -r 将目录即以下档案逐一删除 例:删除所有C语言程序文档,删除 ...

  9. Ejabberd源码解析前奏--概述

    一.绪论    Ejabberd是一个用Erlang/OTP写的开源即时通讯服务器,其是跨平台.分布式.容错且基于开放标准的实时通讯系统.Ejabberd是一个功能丰富的XMPP服务器,同时适合小规模 ...

  10. SharePoint 2013让页面显示错误

    转:http://blog.csdn.net/zmoneyz/article/details/20460263 1. 在网站端口下,如80端口下的Web.config修改 (1)将<custom ...