题目描述

你有许多电脑,它们的硬盘用不同的文件系统储存数据。你想要通过格式化来统一文件系统。格式化硬盘可能使它的容量发生变化。为了格式化,你需要买额外的硬盘。当然,你想要买容量最小的额外储存设备以便省钱。你可以按任意顺序格式化硬盘。格式化之前,你要把该硬盘上所有数据移到一个或更多的其他硬盘上(可以分割数据)。格式化后,该硬盘可以立刻开始使用。你没有必要把数据放到它原来所在的硬盘上。数据也可以被放到你额外买的硬盘上。举个例子,假设你有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\n" , ans);
return 0;
}

最新文章

  1. webapi文档描述-swagger
  2. Issue 3:数据处理基本认识
  3. 如何查询Oracle中所有用户信息
  4. 如何设置table中&lt;tr&gt;和&lt;td&gt;的高度
  5. shell 内网主机存活探测器
  6. 使用 Puppet 在 Windows Azure 中配备 Linux 和 Windows 环境
  7. uva 1589 by sixleaves
  8. Setting DPDK+OVS+QEMU on CentOS
  9. 并发容器ConcurrentHashMap#put方法解析
  10. Hadoop分布式集群搭建hadoop2.6+Ubuntu16.04
  11. TCP网络编程-----客户端请求连接服务器、向服务器发数据、从服务器接收数据、关闭连接
  12. information_schema.COLUMNS
  13. php 安装gzip
  14. NET Core微服务之路:SkyWalking+SkyApm-dotnet分布式链路追踪系统的分享
  15. JS-JS代码插入位置
  16. c语言数组应用
  17. oc中类的实例化及方法调用
  18. html中label及加上属性for之后的用法
  19. 名称随id的变化而变化
  20. jQuery UI dialog 使用记录

热门文章

  1. 详解Linux运维工程师
  2. 上传文件到阿里云linux服务器
  3. php将html页面截图并保存成图片
  4. Nginx反向代理 Laravel获取真实IP地址(PHP)
  5. connect() to unix:/var/run/php-fpm.sock failed (11: Resource temporarily unavailable)
  6. django模型的字段查询
  7. Scrapy核心组件
  8. 集成activiti到现有项目中
  9. Android开发——View绘制过程源码解析(一)
  10. CSS3单选动画