• 题解 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);
    	}
    }
    
  • 相关阅读:
    【扩展】1. PHP 大括号{} 的使用
    preg_replace 中修正符 e 的解析
    terminal 修改终端显示的名字
    find 命令详解
    OSI 7层结构 粗认识
    vi 全解析
    awk 学习笔记
    scp 复制远程文件 文件带空格 处理
    更新博客地址啦!!!
    ubuntu16.04安装NVIDIA驱动遇到的问题
  • 原文地址:https://www.cnblogs.com/Randolph68706/p/11848055.html
Copyright © 2020-2023  润新知