CF1408D Searchlights(贪心模型)
https://zhuanlan.zhihu.com/p/268630329
在知乎上有位网友总结出来一种贪心套路
这题的本质上是对于每对数,要将ai放入A集合或者把bi放入B集合
最后求min(MAX(A)+MAX(B)),因此采用排序后,保留合适的值
之后枚举每种可能答案即可
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; const int N=4e6+10; const int mod=1e9+7; int a[N],b[N],c[N],d[N]; struct node{ int l,r; }s[N]; int cnt1[N],cnt2[N]; bool cmp(node a,node b){ if(a.l==b.l) return a.r<b.r; return a.l<b.l; } vector<pll> num; int main(){ ios::sync_with_stdio(false); int n,m; cin>>n>>m; int i,j; for(i=1;i<=n;i++){ cin>>a[i]>>b[i]; } for(i=1;i<=m;i++){ cin>>c[i]>>d[i]; } int idx=0; for(i=1;i<=n;i++){ for(j=1;j<=m;j++){ if(c[j]>=a[i]&&d[j]>=b[i]){ s[++idx]={c[j]-a[i]+1,d[j]-b[i]+1}; } } } sort(s+1,s+1+idx,cmp); if(idx==0){ cout<<0<<endl; return 0; } num.push_back({s[idx].l,s[idx].r}); int cur=0; for(i=idx-1;i>=1;i--){ if(s[i].r>num[cur].second){ num.push_back({s[i].l,s[i].r}); cur++; } } int ans=0x3f3f3f3f; ans=min(num[0].first,num[(int)num.size()-1].second); int len=(int)num.size()-1; for(i=0;i<len;i++){ ans=min(ans,num[i].second+num[i+1].first); } cout<<ans<<endl; }
没有人不辛苦,只有人不喊疼