BZOJ 4619: [Wf2016]Swap Space(贪心)

传送门

解题思路

  首先肯定是先处理\(b>a\)的,这样可以获得更多空间。处理时要先处理\(a\)比较小的,再处理\(a\)比较大的,因为要求最小值,而\(b>a\)的总量是确定的,那么就让每步尽量小。后处理\(b<a\)时,要先处理\(b\)比较大的,这样可以有更多空间。

代码


#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
 
using namespace std;
const int N=1000005;
typedef long long LL;
 
template<class T> void rd(T &x){
    x=0;char ch=getchar();
    while(!isdigit(ch)) ch=getchar();
    while(isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
}
 
int n,cnt1,cnt2;
struct Data{
    int a,b;
}t1[N],t2[N];
 
inline bool cmp1(Data A,Data B) {return A.b>B.b;}
inline bool cmp2(Data A,Data B) {return A.a<B.a;}
 
int main(){
    rd(n);int x,y;LL Max=0,now=0;
    for(int i=1;i<=n;i++) {
        rd(x),rd(y);
        if(y-x>=0) t1[++cnt1].a=x,t1[cnt1].b=y;
        else t2[++cnt2].a=x,t2[cnt2].b=y;
    }
    sort(t1+1,t1+1+cnt1,cmp2);sort(t2+1,t2+1+cnt2,cmp1);
    for(int i=1;i<=cnt1;i++) {
        if(now<t1[i].a) Max=max(Max,(LL)t1[i].a-now);
        now=now-t1[i].a+t1[i].b; 
    }
    for(int i=1;i<=cnt2;i++){
        if(now<t2[i].a) Max=max(Max,(LL)t2[i].a-now);
        now=now-t2[i].a+t2[i].b;
    }
    printf("%lld\n",Max);
    return 0;
}

posted @ 2019-01-11 16:43  Monster_Qi  阅读(181)  评论(0编辑  收藏  举报