NYOJ 2354-分班级(二分)
来源:互联网 发布:苹果mac os x系统下载 编辑:程序博客网 时间:2024/05/21 16:59
题解:一道简单题,之前一直想歪了,set,优先队列都试过,简直年轻,其实直接两次二分就行了,一次二分最小值,一次二分最大值。(注意上下界)
#include<set> #include<map> #include<stack> #include<queue> #include<vector> #include<string> #include<math.h> #include<stdio.h> #include<iostream> #include<string.h> #include<stdlib.h> #include<algorithm> #include<functional> using namespace std;typedef long long ll;#define inf 1000000000 #define mod 1000000007 #define maxn 500005 #define PI 3.1415926 #define lowbit(x) (x&-x) #define eps 1e-9 ll a[maxn], n, k;bool check1(ll x){int i;ll res = 0;for (i = 1;i <= n;i++)if (a[i] < x)res += x - a[i];if (res <= k)return 1;return 0;}bool check2(ll x){int i;ll res = 0;for (i = 1;i <= n;i++)if (a[i] > x)res += a[i] - x;if (res <= k)return 1;return 0;}int main(void){ll i, j, ans1, ans2, tmp, l, r, sum, mid;while (scanf("%lld%lld", &n, &k) != EOF){ans1 = 0;sum = 0;ans2 = 0;for (i = 1;i <= n;i++) scanf("%lld", &a[i]), sum += a[i];ll mx = sum / n;l = 1, r = mx;while (l <= r){mid = (l + r) / 2;if (check1(mid)){ans1 = mid;l = mid + 1;}elser = mid - 1;}if (sum%n) mx++;l = mx;r = sum;while (l <= r){mid = (l + r) / 2;if (check2(mid)){ans2 = mid;r = mid - 1;}elsel = mid + 1;}printf("%lld\n", ans2 - ans1);}return 0;}
阅读全文
1 0
- NYOJ 2354-分班级(二分)
- nyoj 2354 分班级(经典二分)
- 2354: 分班级【二分】
- 【nyoj2354】分班级(经典二分)
- NYOJ - 找球号(一)(二分)
- NYOJ -804 Gift (二分)
- nyoj 疯牛(二分+贪心)
- nyoj 2354 同时也是 codeforces Robin Hood(二分)
- 蓝桥杯 分巧克力(二分)
- 二分查找(20 分)
- Python 小练习_班级平均分
- 各个班级学生成绩平均分
- js计算出该班级的平均分
- NYOJ练习题 删除元素(二分查找)
- NYOJ 776 删除元素(二分查找)
- nyoj 疯牛(二分搜索+贪心)
- nyoj-680(摘枇杷) 贪心 + 二分
- nyoj 586 疯牛(二分+贪心)
- linux 常用命令笔记
- 插入排序及其优化
- JSON.parseObject将字符串转为bean对象
- 资料网址收集
- WebGL入门基本概念
- NYOJ 2354-分班级(二分)
- Error:Execution failed for task ':processDebugManifest'. > Manifest merger failed with multiple erro
- 奥威Power-BI 连锁商超BI解决方案-会员新增/流失分析
- mybatis注解
- # JavaSE 基础 学习
- 关于C#编写x86与x64程序的分析
- 归并排序
- centos7.2新增sudo用户
- Oracle阶段性基础知识总结