• 【bzoj4619】[Wf2016]Swap Space 贪心


    题目描述

    你有许多电脑,它们的硬盘用不同的文件系统储存数据。你想要通过格式化来统一文件系统。格式化硬盘可能使它的容量发生变化。为了格式化,你需要买额外的硬盘。当然,你想要买容量最小的额外储存设备以便省钱。你可以按任意顺序格式化硬盘。格式化之前,你要把该硬盘上所有数据移到一个或更多的其他硬盘上(可以分割数据)。格式化后,该硬盘可以立刻开始使用。你没有必要把数据放到它原来所在的硬盘上。数据也可以被放到你额外买的硬盘上。举个例子,假设你有4个硬盘A、B、C、D,容量分别为6、1、3、3(GB)。新的文件系统下,它们的容量变为6、7、5、5(GB)。如果你只买1GB额外空间,你可以把B硬盘的数据放过去然后格式化硬盘B。现在你的B硬盘有7GB容量了,那么你就可以把A的数据放过去然后格式化A,最后把C、D的数据放到A上,再格式化C和D。

    输入

    第一行一个数n(1≤n≤1,000,000),表示你的硬盘数。接下来n行,每行两个数a和b,分别表示该硬盘的原容量和新文件系统下的容量。所有容量都以GB为单位,且1≤a,b≤1,000,000,000。

    输出

    输出如果要格式化所有硬盘,你最少需要购买多少额外空间(GB)。

    样例输入

    10
    11 82
    98 12
    78 53
    15 10
    41 2
    81 58
    53 42
    30 41
    25 39
    20 54

    样例输出

    61


    题解

    贪心

    贪心策略:把所有磁盘分为两类:新空间大于原空间、新空间不大于原空间。先处理第一种,按照原空间从小到大排序;再处理第二种,按照新空间从大到小排序。

    对于策略的 证明 理解:显然先处理空间变大的再处理空间变小的,空间变大的应该优先能处理就处理,以剩余更多空间;空间变小的应该让最后剩下的最少,否则会浪费。

    然后分两半排序即可。

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #define N 1000010
    using namespace std;
    typedef long long ll;
    struct data
    {
    	ll x , y;
    }p1[N] , p2[N];
    int t1 , t2;
    bool cmp1(const data &a , const data &b)
    {
    	return a.x < b.x;
    }
    bool cmp2(const data &a , const data &b)
    {
    	return a.y > b.y;
    }
    int main()
    {
    	int n , i;
    	ll a , b , now = 0 , ans = 0;
    	scanf("%d" , &n);
    	for(i = 1 ; i <= n ; i ++ )
    	{
    		scanf("%lld%lld" , &a , &b);
    		if(a < b) p1[++t1].x = a , p1[t1].y = b;
    		else p2[++t2].x = a , p2[t2].y = b;
    	}
    	sort(p1 + 1 , p1 + t1 + 1 , cmp1) , sort(p2 + 1 , p2 + t2 + 1 , cmp2);
    	for(i = 1 ; i <= t1 ; i ++ )
    	{
    		if(now < p1[i].x) ans += p1[i].x - now , now = p1[i].x;
    		now += p1[i].y - p1[i].x;
    	}
    	for(i = 1 ; i <= t2 ; i ++ )
    	{
    		if(now < p2[i].x) ans += p2[i].x - now , now = p2[i].x;
    		now -= p2[i].x - p2[i].y;
    	}
    	printf("%lld
    " , ans);
    	return 0;
    }
    

     

  • 相关阅读:
    qt鼠标事件总结(坐标,跟踪,点击判断)
    从零开始学C++之RTTI、dynamic_cast、typeid、类与类之间的关系uml
    前端篇: 前端演进史
    找一款防文件或文件夹误删除,移动,修改的软件
    yyyy
    盘点我用过的那些网盘(那些年,我们一起玩的网盘)
    Win8/8.1/10获得完整管理员权限的方法
    [置顶] IT老男人读《因为痛,所以叫青春》
    dddd
    用JUNCTION映射文件夹内容 解决多系统跑同一个虚拟机而共享文件夹路径不同的问题
  • 原文地址:https://www.cnblogs.com/GXZlegend/p/7411425.html
Copyright © 2020-2023  润新知