题解 SP27102/UVA1747 【Swap Space】

SP27102 【Swap Space】

双倍经验:UVA1747 Swap Space

用(a,b)表示每个硬盘的原容量和新文件系统下的容量。分两种情况考虑:a≤b和a>b

第一类a≤b格式化后能增加我们的剩余容量,所以肯定要优先格式化,按照a从小到大排序,所需空间较少,这样一来可以用较少的空间换取更多的空间;

第二类a>b会减小容量。考虑时间倒流。从后往前倒着看,容量增加,此时看作(b,a),由第一类可知容量增加时我们应当以第一个数b从小到大排序。但由于我们是倒着看,所以实际上先后顺序为b从大到小

例如原容量为7,对于(6,2),容量-4,7->3;如果从后往前反着看则是容量3->7,a,b为(2,6)。

#include<cstdio>
#include<algorithm>
using namespace std;
#define ll long long
struct node {
	int a,b,c;
} m[1000010],mm[1000010];
inline bool cmp1(node a,node b) {
	return a.a<b.a;
}
inline bool cmp2(node a,node b) {
	return a.b>b.b;
}
int main() {
	ll n,cnt1,cnt2,ans,s;
	while(scanf("%lld",&n)!=EOF) {
		cnt1=cnt2=ans=s=0;
		for (ll x,y; n; n--) {
			scanf("%lld%lld",&x,&y);
			if (x<=y) //分成两类存储排序
				m[++cnt1]=(node) {
				x,y,y-x
			};
			else
				mm[++cnt2]=(node) {
				x,y,y-x
			};
		}
		sort(m+1,m+cnt1+1,cmp1);
		sort(mm+1,mm+cnt2+1,cmp2);
        
        // ans存储所需的额外容量(当前的硬盘文件放满s剩余容量后还需要的额外容量,这里用负数的方式统计最多需要多少额外容量),s存储通过格式化硬盘所获得的容量
		for (int i=1; i<=cnt1; i++)
			ans=min(ans,s-m[i].a),s+=m[i].c;
		for (int i=1; i<=cnt2; i++)
			ans=min(ans,s-mm[i].a),s+=mm[i].c;
		printf("%lld
",ans>0? ans:-ans);
	}
}
原文地址:https://www.cnblogs.com/Randolph68706/p/11848055.html