[ICPC2016 WF] Swap Space 的题解

题目大意

给你 n 个硬盘,第 i 个硬盘原来有 ai 的内存,但是在转化格式之后内存就变成了 bi。在转化格式的时候,全部的资料都需要转移到其他空间,如果空间不够用就可以额外申请空间。在最开始的时候每个硬盘都装满了,求额外申请的空间的最小值。

思路

首先所有的硬盘一共与三种分类:ai<biai=biai>bi

因为第 2 类对于答案没有影响,所以为了便于处理,我们将第 2 类归入第一类,即 aibiai>bi

应该优先处理第 1 类,因为在修改之后剩余的空间是在增加的。

对于第 1 类,应该按 ai 从小到大处理更优,证明如下:

假设有 2 块硬盘分别是 (a1,b1)(a2,b2)

如果 b1a2:先处理 a1 再处理 a2,需要的代价是 a1;先处理 a2 再处理 a1,需要的代价是 a2。因为 a1a2,所以先处理第 1 块更优。

如果 b1<a2:先处理 a1 再处理 a2,需要的代价是 a1+a2b1;先处理 a2 再处理 a1,需要的代价是 a2。因为a1+a2b1a2,所以先处理第 1 块更优。

对于第 2 类,应该按 bi 从大到小处理更优,证明如下:

假设有 2 块硬盘分别是 (a1,b1)(a2,b2)

如果 b1a2:先处理 a1 再处理 a2,需要的代价是 a1;先处理 a2 再处理 a1,需要的代价是 a2+a1b2。因为 a1a2+a1b2,所以先处理第 1 块更优。

如果 b1<a2:先处理 a1 再处理 a2,需要的代价是 a1+a2b1;先处理 a2 再处理 a1,需要的代价是 a2+a1b2。因为a1+a2b1a2+a1b2,所以先处理第 1 块更优。

所以,排序之后模拟整个过程,时间复杂度 O(nlogn)

AC Code

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+5;
int n,c1,c2,ans,cnt;
struct node{int a,b;}s1[N],s2[N];
bool cmp1(node x,node y){return x.a<y.a;}
bool cmp2(node x,node y){return x.b>y.b;}
signed main(){
	cin>>n;
	for(int i=1,a,b;i<=n;i++){
		cin>>a>>b;
		if(a<b) s1[++c1]={a,b};
		else s2[++c2]={a,b};
	}sort(s1+1,s1+1+c1,cmp1),sort(s2+1,s2+1+c2,cmp2);
	for(int i=1;i<=c1;i++){
		if(cnt<s1[i].a) ans+=(s1[i].a-cnt),cnt=0;
		else cnt-=s1[i].a;
		cnt+=s1[i].b;
	}for(int i=1;i<=c2;i++){
		if(cnt<s2[i].a) ans+=(s2[i].a-cnt),cnt=0;
		else cnt-=s2[i].a;
		cnt+=s2[i].b;
	}cout<<ans<<endl;
	return 0;
}
posted @   未抑郁的刘大狗  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示