Salary Changing

Thinking

这道题第一思路就是二分,模拟了一下样例,感觉好像行于是就开始写。

对于二分,我们一定是二分中位数是什么,二分的边界对我们来说是非常重要的,所以我们在二分前有必要确认我们的二分边界,因为一定有∑i=1nli<=s\sum _{i = 1} ^ {n} l_i <= s∑i=1n​li​<=s,所以我们对lll数组sortsortsort一遍,得到left=lmidleft = l_{mid}left=lmid​,同样的,对rrr数组sortsortsort一遍,得到right=rmidright = r_{mid}right=rmid​,接下来我们就可以开始我们的二分了。

但是这道题的难点不是在二分思想上,而是judgejudgejudge函数有点难写:

  • 首先我们对每一个人的salarysalarysalary按照rrr从小到大排序。
  • 接下来,我们可以通过二分得到salaryl<=mid<=salaryrsalary_l <= mid <= salary_rsalaryl​<=mid<=salaryr​的人数量numnumnum,如果n<n/2+1n < n / 2 + 1n<n/2+1这个二分值过大,直接返回false。
  • 否则我们进行贪心的选值,记录下这些点的salarylsalary_lsalaryl​,然后进行排序,优先选择小的去补充我们所需的salary<midsalary < midsalary<mid,但是还没有选满的。
  • 接下来就是对于salary>=midsalary >= midsalary>=mid的进行贪心选,假设他的salaryl>xsalary_l > xsalaryl​>x就选择salarylsalary_lsalaryl​,否则的话就是选择xxx。

下面代码中有更详细的描述judgejudgejudge函数。

Coding

#include <bits/stdc++.h>
#define mp make_pair
#define pb push_backusing namespace std;typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;const double pi = acos(-1.0);
const double eps = 1e-7;
const int inf = 0x3f3f3f3f;inline ll read() {ll f = 1, x = 0;char c = getchar();while(c < '0' || c > '9') {if(c == '-')    f = -1;c = getchar();}while(c >= '0' && c <= '9') {x = (x << 1) + (x << 3) + (c ^ 48);c = getchar();}return f * x;
}const int N = 2e5 + 10;ll L[N], R[N], n, s, m;struct Node {int l, r;bool operator < (const Node & t) const {return r < t.r;}
}a[N];bool judge(int x) {int p = lower_bound(R + 1, R + 1 + n, x) - R;int last = n - p + 1;//后面剩下了多少个数,if(last < m)    return false;//如果没办法满足 >= x的人数至少有n / 2 + 1个,那么x过大。vector<int> v;for(int i = p; i <= n; i++) v.pb(a[i].l);sort(v.begin(), v.end());int need = m - 1 - (p - 1);//前面选择完任然不够,所需要的。ll sum = L[p - 1];//一个前缀和数组,看main函数即可理解for(int i = 0; i < need; i++) {sum += v[i];if(v[i] > x)    return false;//一定满足前面的数 <= x,}for(int i = need; i < v.size(); i++)    sum += max(x, v[i]);return sum <= s;
}int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "r", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);int _ = read();while(_--) {n = read(), s = read();m = n / 2 + 1;for(int i = 1; i <= n; i++) {a[i].l = read(), a[i].r = read();L[i] = a[i].l, R[i] = a[i].r;}sort(a + 1, a + 1 + n);sort(L + 1, L + 1 + n);sort(R + 1, R + 1 + n);int l = L[(n >> 1) + 1], r = R[(n >> 1) + 1];for(int i = 1; i <= n; i++)L[i] = a[i].l + L[i - 1];while(l < r) {int mid = l + r + 1 >> 1;if(judge(mid))  l = mid;else r = mid - 1;}printf("%d\n", l);}return 0;
}

D. Salary Changing(二分,前缀和,贪心,瞎搞)相关推荐

  1. Educational Codeforces Round 75 (Rated for Div. 2) D. Salary Changing 二分 + check

    传送门 文章目录 题意: 思路: 题意: 思路: 直接算不好算,考虑二分这个中位数midmidmid. 考虑如何checkcheckcheck,这个分情况来就好了: (1)mid>a[i].r( ...

  2. codeforces1041D Glider(二分/前缀和/贪心)

    题目链接:codeforces 1041D 题目思路: 显然,为了尽可能覆盖多的区间,起点一定是某段区间的左端点,故枚举左端点,二分查找终点,下降的高度用前缀和记录即可.具体参见代码. 参考代码: # ...

  3. P1083 借教室(标记永久化线段树/二分+前缀和)难度⭐⭐⭐★

    P1083 借教室 标记永久化线段树 很典型的区间修改问题,先输入赋值建树(这就是最典型的线段树呀,别忘了),然后修改 这里问的是是否有足够的空教室,所以线段树中 min 代表的是当前区间内最小的剩余 ...

  4. POJ 3061 (二分+前缀和or尺取法)

    题目链接: http://poj.org/problem?id=3061 题目大意:找到最短的序列长度,使得序列元素和大于S. 解题思路: 两种思路. 一种是二分+前缀和.复杂度O(nlogn).有点 ...

  5. 【实数二分/前缀和维护】Best Cow Fences

    Poj 2018 Best Cow Fences 实数二分+前缀和维护 调了一晚上, 但发现没什么注意事项orz 无输出只因eps定义成了int型QAQ哭唧唧 #include<cstdio&g ...

  6. 最大子矩阵(前缀和+贪心)

    题目描述 给定一个包含整数的二维矩阵,子矩形是位于整个阵列内的任何大小为1 * 1或更大的连续子阵列. 矩形的总和是该矩形中所有元素的总和. 在这个问题中,具有最大和的子矩形被称为最大子矩形. 例如, ...

  7. Maximize The Beautiful Value (前缀和贪心)

    Maximize The Beautiful Value (前缀和&贪心) 题目传送门 题意:给定长度为n不递减序列,求操作一次使其F[n]最大. #include<bits/stdc+ ...

  8. [JZOJ5281]钦点题解--瞎搞+链表

    [JZOJ5281]钦点题解--瞎搞+链表 题目链接 于 暴 力 过 分析 第一眼: 模拟美滋滋?! 然后数据范围...不太对 naiive模拟30pts 然后你交换字符串指针60pts 然后发现可以 ...

  9. android重置系统,安卓手机越用越卡,恢复出厂设置真有用?别瞎搞,看完就明白了!...

    安卓手机越用越卡,恢复出厂设置真有用?别瞎搞,看完就明白了! 现在手机的价格逐渐的开始上升,一部好一点的手机价格还是比较贵的,所以很多人想要节省更多的换机支出,都会想要购买到一款可以使用的比较久的手机 ...

最新文章

  1. 32位oracle和64位的区别,区分你的oracle是64位还是32位
  2. 打造史上最小尺寸.Net Core单文件应用程序
  3. 案例 github_github 项目搜索技巧-让你更高效精准地搜索项目
  4. 【转】1.4异步编程:轻量级线程同步基元对象
  5. python多进程之间的通信:消息队列Queue
  6. Halcon例程学习之距离变换(distance_transform)
  7. HTML中IE版本条件注释整理
  8. 【综述笔记】Graph Neural Networks in Recommender Systems
  9. SpringBoot中接口跨域问题
  10. IDEA创建JSP项目
  11. 第 11 章 Harddisk
  12. Python3对股票的收益和风险进行分析
  13. 三维温度场 matlab,matlab绘制温度场
  14. 内存分配函数总结- 陈敏的博客- CSDN博客
  15. 《跟小智一起学网络》教程目录
  16. golang识别身份证号
  17. 达梦数据库 开发版试用时间限制
  18. UG NX 12 组合投影曲线
  19. JavaBean 技术与 JSP 开发模型练习题
  20. vue 快速入门、常用指令(1)

热门文章

  1. oracle log.xml分析,Oracle11g 中使用ADRCI 查看alert log文件(xml格式)
  2. 计算机与交通工程论文,交通工程论文.doc
  3. 30张不明觉厉的照片,看几遍终于看懂了
  4. 华为21级程序员月薪曝光:270k封神!众网友直呼长见识……
  5. 离职总结:大公司与小公司的个人体验
  6. k8s 查看ip地址属于哪个pod_Kubernetes Pod 如何获取 IP 地址
  7. 服务器运维监控指标,运维体系~指标监控~Prometheus监控告警与日志
  8. php读取excel函数,PHP读取Excel函数Spreadsheet_Excel_Reader
  9. 用java程序实现记单词_java实现背单词程序
  10. linq查询不包含某个值的记录_【翻译】C#表达式中的动态查询