zoukankan      html  css  js  c++  java
  • 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
    ",Max);
        return 0;
    }
    
    
  • 相关阅读:
    图床_shell命令grep/egrep
    图床_shell命令vi/vim
    图床_shell命令tr
    图床_shell命令wc
    图床_shell命令vimdiff
    图床_shell命令diff
    图床_shell命令rev
    图床_shell命令cut
    图床_shell命令tail
    图床_shell命令head
  • 原文地址:https://www.cnblogs.com/sdfzsyq/p/10255943.html
Copyright © 2011-2022 走看看