• 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
    没有人不辛苦,只有人不喊疼
  • 相关阅读:
    【C++日常】C++动态命名变量名
    两个整数相除
    Jsp页面跳转 接收时的乱码问题
    Reverse a singly linked list
    Java处理excel文件
    Navicat for mysql 破解
    EasyUi 分页 和 表格数据加载
    Spring 框架下Controller 返回结果在EasyUI显示
    svn ubuntu command(转载)
    Shiro Security
  • 原文地址:https://www.cnblogs.com/ctyakwf/p/13902315.html
Copyright © 2020-2023  润新知