D. Salary Changing(二分,前缀和,贪心,瞎搞)
Salary Changing
Thinking
这道题第一思路就是二分,模拟了一下样例,感觉好像行于是就开始写。
对于二分,我们一定是二分中位数是什么,二分的边界对我们来说是非常重要的,所以我们在二分前有必要确认我们的二分边界,因为一定有∑i=1nli<=s\sum _{i = 1} ^ {n} l_i <= s∑i=1nli<=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(二分,前缀和,贪心,瞎搞)相关推荐
- Educational Codeforces Round 75 (Rated for Div. 2) D. Salary Changing 二分 + check
传送门 文章目录 题意: 思路: 题意: 思路: 直接算不好算,考虑二分这个中位数midmidmid. 考虑如何checkcheckcheck,这个分情况来就好了: (1)mid>a[i].r( ...
- codeforces1041D Glider(二分/前缀和/贪心)
题目链接:codeforces 1041D 题目思路: 显然,为了尽可能覆盖多的区间,起点一定是某段区间的左端点,故枚举左端点,二分查找终点,下降的高度用前缀和记录即可.具体参见代码. 参考代码: # ...
- P1083 借教室(标记永久化线段树/二分+前缀和)难度⭐⭐⭐★
P1083 借教室 标记永久化线段树 很典型的区间修改问题,先输入赋值建树(这就是最典型的线段树呀,别忘了),然后修改 这里问的是是否有足够的空教室,所以线段树中 min 代表的是当前区间内最小的剩余 ...
- POJ 3061 (二分+前缀和or尺取法)
题目链接: http://poj.org/problem?id=3061 题目大意:找到最短的序列长度,使得序列元素和大于S. 解题思路: 两种思路. 一种是二分+前缀和.复杂度O(nlogn).有点 ...
- 【实数二分/前缀和维护】Best Cow Fences
Poj 2018 Best Cow Fences 实数二分+前缀和维护 调了一晚上, 但发现没什么注意事项orz 无输出只因eps定义成了int型QAQ哭唧唧 #include<cstdio&g ...
- 最大子矩阵(前缀和+贪心)
题目描述 给定一个包含整数的二维矩阵,子矩形是位于整个阵列内的任何大小为1 * 1或更大的连续子阵列. 矩形的总和是该矩形中所有元素的总和. 在这个问题中,具有最大和的子矩形被称为最大子矩形. 例如, ...
- Maximize The Beautiful Value (前缀和贪心)
Maximize The Beautiful Value (前缀和&贪心) 题目传送门 题意:给定长度为n不递减序列,求操作一次使其F[n]最大. #include<bits/stdc+ ...
- [JZOJ5281]钦点题解--瞎搞+链表
[JZOJ5281]钦点题解--瞎搞+链表 题目链接 于 暴 力 过 分析 第一眼: 模拟美滋滋?! 然后数据范围...不太对 naiive模拟30pts 然后你交换字符串指针60pts 然后发现可以 ...
- android重置系统,安卓手机越用越卡,恢复出厂设置真有用?别瞎搞,看完就明白了!...
安卓手机越用越卡,恢复出厂设置真有用?别瞎搞,看完就明白了! 现在手机的价格逐渐的开始上升,一部好一点的手机价格还是比较贵的,所以很多人想要节省更多的换机支出,都会想要购买到一款可以使用的比较久的手机 ...
最新文章
- 32位oracle和64位的区别,区分你的oracle是64位还是32位
- 打造史上最小尺寸.Net Core单文件应用程序
- 案例 github_github 项目搜索技巧-让你更高效精准地搜索项目
- 【转】1.4异步编程:轻量级线程同步基元对象
- python多进程之间的通信:消息队列Queue
- Halcon例程学习之距离变换(distance_transform)
- HTML中IE版本条件注释整理
- 【综述笔记】Graph Neural Networks in Recommender Systems
- SpringBoot中接口跨域问题
- IDEA创建JSP项目
- 第 11 章 Harddisk
- Python3对股票的收益和风险进行分析
- 三维温度场 matlab,matlab绘制温度场
- 内存分配函数总结- 陈敏的博客- CSDN博客
- 《跟小智一起学网络》教程目录
- golang识别身份证号
- 达梦数据库 开发版试用时间限制
- UG NX 12 组合投影曲线
- JavaBean 技术与 JSP 开发模型练习题
- vue 快速入门、常用指令(1)
热门文章
- oracle log.xml分析,Oracle11g 中使用ADRCI 查看alert log文件(xml格式)
- 计算机与交通工程论文,交通工程论文.doc
- 30张不明觉厉的照片,看几遍终于看懂了
- 华为21级程序员月薪曝光:270k封神!众网友直呼长见识……
- 离职总结:大公司与小公司的个人体验
- k8s 查看ip地址属于哪个pod_Kubernetes Pod 如何获取 IP 地址
- 服务器运维监控指标,运维体系~指标监控~Prometheus监控告警与日志
- php读取excel函数,PHP读取Excel函数Spreadsheet_Excel_Reader
- 用java程序实现记单词_java实现背单词程序
- linq查询不包含某个值的记录_【翻译】C#表达式中的动态查询