bzoj4619 4619: [Wf2016]Swap Space

时间:2021-04-19 10:28:44

传送门

分析

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

对于第一种情况我们自然要选择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[],b[];
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=;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+,a+cnt1+,cmp1);
sort(b+,b+cnt2+,cmp2);
int Ans=,now=;
for(i=;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=;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 ;
}