二分显然,但是被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
*/
标签:二分,匹配,int,C240817C,mid,贪心
From: https://www.cnblogs.com/superl61/p/18364511