二分C. Keshi Is Throwing a Party
Posted 行码棋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二分C. Keshi Is Throwing a Party相关的知识,希望对你有一定的参考价值。
题目链接:
https://codeforces.com/problemset/problem/1610/C
n
个盆友,第i
个盆友有i
块钱,小明想尽可能邀请更多的人。第i
个人高兴有个条件,比他钱多的不能超过 a i a_i ai个人,钱少的不能超过 b i b_i bi个,求最多能邀请的人数。
可以发现对于人数有一个单调的性质,假设答案为ans
,人数大于ans
的情况必然不会满足,人数小于等于ans
的必然满足条件。
基于单调性使用二分
二分主要是检验函数:
假设此时选择的人数为x
人标号 1 , 2 , 3 , 4 , 5 ,....,x
比其钱少的人数 0, 1, 2, 3, 4,....,x-1
比其钱多的人数x-1,x-2,x-3,x-4,x-5,..., 0
只要满足每个人的情况a[i]
>=比其钱多的人数,b[i]
>=比其钱少的人数,从前往后遍历即可。
最近准备转换一下代码风格,尽量减少全局变量的使用。尽量在一个函数内实现相应的功能。
所以本代码出现了lamda表达式内容。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5+5;
void solve()
int n;
cin>>n;
vector<int>a(n+1),b(n+1);
for(int i=1;i<=n;i++) cin>>a[i]>>b[i];
function<bool(int)> check = [&](int x)->bool
int cur = 0;
for(int i=1;i<=n;i++)
if(b[i]>=cur and a[i]>=x-1-cur and cur<=x-1) cur++;
if(cur>x-1) return true;
return false;
;
int l=0,r=n;
while(l<r)
int mid = l + r + 1 >> 1;
if(check(mid)) l = mid;
else r = mid - 1;
cout<<l<<endl;
int main()
int t;
// t = 1;
cin>>t;
while(t--) solve();
return 0;
以上是关于二分C. Keshi Is Throwing a Party的主要内容,如果未能解决你的问题,请参考以下文章
Oauth2 Client Credentials Flow + Spring Boot2 throwing There is no PasswordEncoder mapped > for t
Codeforces Round #603 (Div. 2) C. Everyone is a Winner! (数学)
C. Everyone is a Winner!(整除分块)
Codeforces Round #417 (Div. 2) C. Sagheer and Nubian Market 二分答案 +排序