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;
}
View Code

 

posted @ 2020-10-30 15:20  朝暮不思  阅读(115)  评论(0编辑  收藏  举报