建议加强数据,本题可以用玄学办法通过
查看原帖
建议加强数据,本题可以用玄学办法通过
312767
Ayin楼主2023/8/27 07:55
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e6+8;
int read(){
    int a=0,b=1;
    char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch=='-') b=-1;
    for(;isdigit(ch);ch=getchar()) a=a*10+(ch-48);
    return a*b;
}
int n;
int maxn;
int minn=1e15;
int endn;
unordered_map<int,int> mp;
struct node{int a,b;}num[N];
int boc[N];
bool cmp(const node &f1,const node &f2){return f1.a==f2.a?f1.b<f2.b:f1.a<f2.a;}
int maxa,minb=1e15;
signed main(){
    n=read();
    for(int i=1;i<=n;i++) num[i].a=read(),num[i].b=read(),maxn=max(maxn,max(num[i].a,num[i].b)),minb=min(minb,num[i].b);
    endn=maxn;
    maxa=maxn;
    sort(num+1,num+n+1,cmp);
    for(int i=n;i>=1;i--){
        if(num[i].a>num[i].b){
            if(minn>num[i].b){
                if(endn>num[i].b){
                    if(endn-num[i].b<=(min(minn,num[i].a)-num[i].b)*2){
                        maxn+=endn-num[i].b;
                        endn=num[i].b;
                    }
                    else{
                        maxn+=(min(minn,num[i].a)-num[i].b)*2;
                        minn=num[i].b;
                    }
                }
            }
        }
    }
    maxa=maxa*2-minb;
    printf("%lld\n",min(maxa,maxn));
    return 0;
}

这是错误的贪心策略,但在当前数据下可以过

2023/8/27 07:55
加载中...