bzoj4619 4619: [Wf2016]Swap Space

传送门

分析

首先不难想到我们要先处理容量变大的再处理容量变小的

对于第一种情况我们自然要选择x小的先格式化,因为这个样暂时存储所需空间较小,可以使得情况更优

而第二种情况y先考虑,因为这样对总空间的减少量小

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
struct node {
    int x,y;
};
node a[1001000],b[1001000];
int cnt1,cnt2;
inline bool cmp1(const node x,const node y){
    return x.x<y.x;
}
inline bool cmp2(const node x,const node y){
    return x.y>y.y;
}
int main(){
    int n,m,i,j,k;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
      int x,y;
      scanf("%d%d",&x,&y);
      if(x<y)a[++cnt1].x=x,a[cnt1].y=y;
        else b[++cnt2].x=x,b[cnt2].y=y;
    }
    sort(a+1,a+cnt1+1,cmp1);
    sort(b+1,b+cnt2+1,cmp2);
    int Ans=0,now=0;
    for(i=1;i<=cnt1;i++){
      if(now<a[i].x){
          Ans+=a[i].x-now;
          now=a[i].x;
      }
      now+=a[i].y-a[i].x;
    }
    for(i=1;i<=cnt2;i++){
      if(now<b[i].x){
          Ans+=b[i].x-now;
          now=b[i].x;
      }
      now+=b[i].y-b[i].x;
    }
    cout<<Ans;
    return 0;
}
posted @ 2019-02-09 15:31  水题收割者  阅读(149)  评论(0编辑  收藏  举报