C240817C. 團隊協作:二分答案+貪心

superl61發表於2024-08-17

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 
*/

相關文章