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