首页 > 其他分享 >Educational Codeforces Round 75 D. Salary Changing(二分)

Educational Codeforces Round 75 D. Salary Changing(二分)

时间:2023-02-03 10:03:29浏览次数:36  
标签:Salary Educational int sum Codeforces MAXN cnt include ll

Educational Codeforces Round 75 D. Salary Changing(二分)_其他

Educational Codeforces Round 75 D. Salary Changing(二分)_其他_02

题意就是: 给n个人发工资,总钱数为s。每个人有一个工资范围。要求一个发工资方案,使得工资中位数最大,求这个中位数。

考虑到中位数最大,于是我们可以二分。但是每个人的工资必须在那个区间,所以我们不能直接二分。

AC代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<stdlib.h>
#include<queue>
#include<stack>
#include<iomanip>
#include<math.h>
using namespace std;
typedef long long ll;
typedef double ld;
const int INF = 1e9;
int i,j,k;
const int MAXN = 2e5+50;
int l[MAXN],r[MAXN];
int n;
ll s;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        cin>>n>>s;
        for(i=0; i<n; i++)
          cin>>l[i]>>r[i];
        int L=0,R=1e9+7;
        while(R>L+1)
        {
            int mid=(L+R)>>1;
            int cnt=0;
            ll sum=0;
            vector<int>v;
            for(i=0; i<n; i++)
            {
                if(l[i]>=mid)
                {
                    sum+=l[i];
                    cnt++;
                }
                else if(r[i]<mid)
                    sum+=l[i];
                else
                {
                    sum+=l[i];
                    v.push_back(mid-l[i]);
                }
            }
            sort(v.begin(),v.end());
            for(i=0; i<(int)v.size(); i++)
            {
                if(cnt>=(n+1)/2)
                    break;
                sum+=v[i];
                cnt++;
            }
            if(cnt>=(n+1)/2&&sum<=s)
                L=mid;
            else
                R=mid;
        }
        cout<<L<<endl;
    }
    return 0;
}

 

 

标签:Salary,Educational,int,sum,Codeforces,MAXN,cnt,include,ll
From: https://blog.51cto.com/u_15952369/6034933

相关文章

  • Educational Codeforces Round 75 C Minimize The Integer
    这道题的意思就是给出一个由数字组成的字符串,相邻的数字可以互换位置,但是如果相邻的为同奇同偶这样就不能交换。让我们求交换任意次数可以产生的最小数。这条限制就是说......
  • codeforces 595 C2. Good Numbers (hard version)
    给出Q组查询,每组给出一个N找到一个>=n的m,m可以分解成不同的3的幂次相加。可以看题意解释,就是转化为3^0,3^1,...,3^m,每个只能出现最多一次,但是可以不同组合,输出符合条件最......
  • codeforces 595 B2 Books Exchange (hard version)
    这道题的意思就是有n本书,每本书都有自己的编号,每次可以移动一本书,把这个本书移动到当前编号对应的位置,求移动几次可以使得编号和位置对应起来。比如样例32312第一......
  • Codeforces Round #848 (Div. 2)(持续更新)
    Preface这场打的可以说发挥了水平但没有完全发挥的说ABC都是一眼一遍过,结果D是我最怕的期望题,大概推了个DP的式子但感觉成环了初始条件又不够(flag)就弃了本来当时看E只有......
  • Codeforces Round #845 (Div. 2) and ByteRace 2023(A,B,C)
    CodeforcesRound#845(Div.2)andByteRace2023(A,B,C)AA这个题目大意是有n个数,我们需要让ai和ai+1的奇偶性不一样我们可以让相邻的两个数变成一个数,那个数就是这两个......
  • 2.2 vp Codeforces Round #848 (Div. 2)
    A-FlipFlopSum题意给出长度为n的序列a,a中只包括1和-1,你必须操作一次,让相邻两个元素由1变-1或由-1变1,问操作后数组总和最大多少思路暴力即可voidsolve(){ intn......
  • Codeforces Round #848 (Div. 2)
    题目链接A核心思路按照题目模拟就好了//Problem:A.FlipFlopSum//Contest:Codeforces-CodeforcesRound#848(Div.2)//URL:https://codeforces.com/cont......
  • Codeforces Round #831 (Div. 1 + Div. 2) A-H
    CodeforcesRound#831(Div.1+Div.2)A-H题解好久之前写的,发现忘记发了比赛题目质量高,推荐!传送门CodeforcesRound#831(Div.1+Div.2)A.FactoriseN+M题......
  • Codeforces Round #848 (Div. 2) A~C
    A.给出一个-1,1序列,操作是交换相邻位置的符号,一定要操作一次,求最大sum。只有4种情况,扫一遍判断是否出现即可。B题面写得真清楚啊:)#include<bits/stdc++.h>usingnam......
  • Codeforces Round #848 (Div. 2) A~F 题解
    A.FlipFlopSum能换\(-1,-1\)就换,不能能换\(1,-1\)或\(-1,1\)也可以,否则只能换\(1,1\)。B.TheForbiddenPermutation如果原序列一开始就是好的那就结束,否则......