首页 > 其他 > 详细

题解 SP27102/UVA1747 【Swap Space】

时间:2019-11-13 14:13:25      阅读:95      评论:0      收藏:0      [点我收藏+]

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\n",ans>0? ans:-ans);
    }
}

题解 SP27102/UVA1747 【Swap Space】

原文:https://www.cnblogs.com/Randolph68706/p/11848055.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!