CF1251D Salary Changing

思路:

二分答案。

实现:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int N = 200005;
 5 ll l[N], r[N];
 6 bool check(ll x, int n, ll s)
 7 {
 8     ll tmp = 0;
 9     int low = 0, up = 0;
10     vector<pair<ll, ll>> v;
11     for (int i = 0; i < n; i++)
12     {
13         if (r[i] < x) { low++; tmp += l[i]; }
14         else if (l[i] >= x) { up++; tmp += l[i]; }
15         else v.push_back(make_pair(l[i], r[i]));
16     }
17     if (up >= (n + 1) / 2) return true;
18     int r = (n + 1) / 2 - up;
19     if (v.size() < r) return false;
20     sort(v.begin(), v.end());
21     for (int i = 0; i < v.size() - r; i++) tmp += v[i].first;
22     tmp += r * x;
23     return tmp <= s;
24 }
25 int main()
26 {
27     int t; cin >> t;
28     while (t--)
29     {
30         int n; ll s; cin >> n >> s;
31         ll L = 0, R = 0;
32         for (int i = 0; i < n; i++) { cin >> l[i] >> r[i]; R = max(R, r[i]); }
33         int res = 0;
34         while (L <= R)
35         {
36             ll m = L + R >> 1;
37             if (check(m, n, s)) { res = m; L = m + 1; }
38             else R = m - 1;
39         }
40         cout << res << endl;
41     }
42     return 0;
43 }

原文地址:https://www.cnblogs.com/wangyiming/p/12251805.html

时间: 2024-11-14 00:08:44

CF1251D Salary Changing的相关文章

Salary Changing CF-1251D(二分)

题意: 有$n$个员工,$s$元钱,现在要给每个员工发工资.每个员工的工资的范围$(l_i,r_i)$,求所有员工的工资中位数的最大值. 思路: 二分答案,$check$的时候判断工资可以大于等于$mid$的员工个数,用最小代价购买之后判断总价钱会不会超出范围. 代码: 1 //#include<bits/stdc++.h> 2 #include <set> 3 #include <map> 4 #include <stack> 5 #include <

Educational Codeforces Round 75 (Rated for Div. 2) D. Salary Changing

链接: https://codeforces.com/contest/1251/problem/D 题意: You are the head of a large enterprise. n people work at you, and n is odd (i.?e. n is not divisible by 2). You have to distribute salaries to your employees. Initially, you have s dollars for it,

D. Salary Changing(找中位数)

题:https://codeforces.com/contest/1251/problem/D 题意:给你n个单位需要满足达到的区间,再给个s,s是要分配给n的单位的量,当然∑l<=s,问经过分配后能够达到的最大中位数是多少 题解:二分找中位数,成立原因:代码注释 #include<bits/stdc++.h> using namespace std; typedef long long ll; #define fo(i,a,b) for(int i=a;i<=b;i++) #de

codeforces D Salary Changing

题意:给你n个人,和s块钱,每个人都有一个工资区间,你给所有人都发工资.然后要他们工资的中位数最大. 思路:二分找那个值.那个值要满足至少有n/2+1个工资区间内. #include<cstdio> #include<cstring> #include<queue> #include<cmath> #include<algorithm> #include<map> #include<vector> #include<

二分题 D - Salary Changing codeforce

题意:给出n个人(n是奇数),s钱:s为总的可以付工钱的钱: 每一个工人有一个付工钱的区间,只要在这个区间范围内,随便一个数都可以当作给这个工人付了钱: 老板要付给每个工人钱,并且付钱的中位数要尽可能大: 问:最大的中位数是多少: 思路:贪心+思维+二分: 我们以中位数为主体进行二分.那么就需要n/2+1个大于等于中位数的数: 这个时候我们先给钱排序,按第一个数从大到小排: 然后check部分,从1到n遍历,如果满足x在区间范围内,就取x这个数: 那么,为什么就要取这个数呢,因为我们迟早要凑到n

Educational Codeforces Round 75

目录 Contest Info Solutions A. Broken Keyboard B. Binary Palindromes C. Minimize The Integer D. Salary Changing E2. Voting (Hard Version) Contest Info Practice Link Solved A B C D E1 E2 F 6/7 O O O O O O - O 在比赛中通过 ? 赛后通过 ! 尝试了但是失败了 - 没有尝试 Solutions A.

Educational Codeforces Round 75 ABCD题解

A. Broken Keyboard Description 给出一串小写字母字符序列,连续出现两次的字母为坏掉的,按字典序输出所有没有坏掉的字母. Solution 模拟暴力删除字母,注意相同字母的去重. 1 #include <algorithm> 2 #include <cctype> 3 #include <cmath> 4 #include <cstdio> 5 #include <cstdlib> 6 #include <cst

DataStage系列教程 (Slowly Changing Dimension)缓慢变化维

BI中维表的增量更新一般有2种: Type 1:覆盖更改.记录的列值发生变化,直接update成最新记录. Type 2:历史跟踪更改.记录值发生变化,将该记录置为失效,再insert一条新的记录. 这两种其实都可以通过sql的left join来实现,不过DataStage给我们提供一个组件,可以很好的实现这个功能,这就是slowly changing dimension. 1 缓慢变化维表示例 如图1所示,是一个常用的缓慢变化维,该表的进数逻辑为: 当记录新插入到改表时,STARTDATE是

LeetCode:Department Highest Salary - 部门内最高工资

1.题目名称 Department Highest Salary(部门内最高工资) 2.题目地址 https://leetcode.com/problems/rising-temperature 3.题目内容 表Employee包括四列:Id.Name.Salary.DepartmentId +----+-------+--------+--------------+ | Id | Name  | Salary | DepartmentId | +----+-------+--------+--