二分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的主要内容,如果未能解决你的问题,请参考以下文章

C. Maximum Median 二分

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 二分答案 +排序

codeforce C. Success Rate