C240817C. 团队协作:二分答案+贪心

C240817C. 团队协作

二分显然,但是被check难住了。

以为只能把运动员按速度分成两类,然后二分图找最大匹配,但显然做不动。

然后考场上就被卡住了………

看了题解突然勾起了对一道题远古的记忆:总之也是二分之后是要看能不能全匹配上。

然后当时用的就是sort之后贪心,发现这个贪心很对,恍然大悟。

A 里面第一小的就应该匹配 B 里面第一个比它大的,匹配后面的,那再匹配 A 后面的数就不优了。

多做题就好了。

#include<bits/stdc++.h>
#define F(i,l,r) for(int i(l);i<=r;++i)
#define G(i,r,l) for(int i(r);i>=l;--i)
#define int ll
using namespace std;
using ll = long long;
const int N=1e5+55;
vector<int> A,B;
int n;
int v[N],w[N];
inline bool check(int lim){
	A.clear();
	B.clear();
	F(i,1,n){
		if(v[i] < lim)	A.emplace_back(w[i]);
		else B.emplace_back(v[i] + w[i] - lim);
	}
	sort(A.begin(),A.end());
	sort(B.begin(),B.end());
	int u = 0, sz = A.size();
	for(auto x:B){
		if(u<sz && A[u]<= x) ++u;
	}
	return u>=sz;
}
signed main(){
//	freopen("team.in","r",stdin); 
//	freopen("team.out","w",stdout);
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	cin>>n;
	F(i,1,n) cin>>v[i]>>w[i];
	int l=0,r=1e9+1,mid;
	while(l+1<r){
		mid=(l+r)>>1;
		if(check(mid)) l=mid;
		else r=mid;
	}
	cout<<l<<"\n";
	return 0;
}
/*		
	T
	n,m,k,st
	u,v,w
	think twice, code once.
	check your code:
	array memory
	testing sentence 
*/

posted @   superl61  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示