4619: [Wf2016]Swap Space

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 129  Solved: 54
[Submit][Status][Discuss]

Description

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

Input

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

Output

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

Sample Input

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

Sample Output

61

HINT

 

Source

鸣谢Shimakaze提供译文

二分+贪心

做法:先按加血扣血分类,加血的按a升序,扣血的按b降序。二分答案,模拟一遍即可(其实还有线性的,但是我懒得写)

证明:看了看黄学长的证明

对于加血的,假设交换相邻两项x[i],x[i+1],有两种情况:

1.交换完不能继续,因为没有x[i]的加血,不足以删除x[i+1]

2.交换完能继续,那么交换和不交换不影响结果,因为交换这两项顺序不影响后面的操作

所以这样是最优的

对于扣血的,比较麻烦,但是对于一个初始的val,最终如果能完成,那么剩余的东西是确定的,于是我们把扣血的那部分倒过来做,那么和加血的就一样了,这样b就是加血,a就是扣血,反过来了,那么反回去就是b降序排列。

证毕

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = ;
const ll inf = ;
struct data {
int l, r, delta;
} x[N];
int n;
bool cp(data i, data j) { return i.delta > j.delta; }
bool cp1(data i, data j) { return i.l < j.l; }
bool cp2(data i, data j) { return i.r > j.r; }
bool C(ll val)
{
for(int i = ; i <= n; ++i)
{
if(val < x[i].l) return false;
val += x[i].delta;
}
return true;
}
int main()
{
scanf("%d", &n);
for(int i = ; i <= n; ++i) scanf("%d%d", &x[i].l, &x[i].r), x[i].delta = x[i].r - x[i].l;
sort(x + , x + n + , cp);
int pos = ;
for(int i = ; i <= n; ++i) if(x[i + ].delta <= ) { pos = i; break; }
sort(x + , x + pos + , cp1); sort(x + pos + , x + n + , cp2);
ll l = , r = inf, ans = ;
while(r - l > )
{
ll mid = (l + r) >> ;
if(C(mid)) r = ans = mid; else l = mid;
}
printf("%lld\n", ans);
return ;
}

bzoj4619的更多相关文章

  1. 【BZOJ4619/3709】[Wf2016]Swap Space/[PA2014]Bohater 贪心

    [BZOJ4619][Wf2016]Swap Space Description 你有许多电脑,它们的硬盘用不同的文件系统储存数据.你想要通过格式化来统一文件系统.格式化硬盘可能使它的容量发生变化.为 ...

  2. 【bzoj4619】[Wf2016]Swap Space 贪心

    题目描述 你有许多电脑,它们的硬盘用不同的文件系统储存数据.你想要通过格式化来统一文件系统.格式化硬盘可能使它的容量发生变化.为了格式化,你需要买额外的硬盘.当然,你想要买容量最小的额外储存设备以便省 ...

  3. bzoj4619 4619: [Wf2016]Swap Space

    传送门 分析 首先不难想到我们要先处理容量变大的再处理容量变小的 对于第一种情况我们自然要选择x小的先格式化,因为这个样暂时存储所需空间较小,可以使得情况更优 而第二种情况y先考虑,因为这样对总空间的 ...

  4. 【bzoj4922】[Lydsy六月月赛]Karp-de-Chant Number 贪心+背包dp

    题目描述 给出 $n$ 个括号序列,从中选出任意个并将它们按照任意顺序连接起来,求以这种方式得到匹配括号序列的最大长度. 输入 第一行包含一个正整数n(1<=n<=300),表示括号序列的 ...

随机推荐

  1. Spider-Python爬虫之XPath 教程

    原文链接:https://www.runoob.com/xpath/xpath-syntax.html XPath 术语 XPath 节点 七种类型:在 XPath 中,有七种类型的节点:元素.属性. ...

  2. 82-Ichimoku Kinko Hyo 一目平衡表.(2015.7.3)

    Ichimoku Kinko Hyo 一目平衡表 计算: 一目平衡图由五组参数合成,与现在常用的移动平均线吻合.参数基于各个长短周期的高低点,提供一明确简单的走势图.五个参数如下: 1.短轴快线 短轴 ...

  3. 一个关于vue+mysql+express的全栈项目(一)

    最近学了mysql数据库,寻思着能不能构思一个小的全栈项目,思来想去,于是就有了下面的项目: 先上几张效果图吧       目前暂时前端只有这几个页面,后端开发方面,有登录,注册,完善用户信息,获取用 ...

  4. Uva 1103 古代象形符号(dfs求连通块, floodfill, 进制转换)

    题意: 给定一个H行W列的字符矩阵(H<200, W < 50), 输入的是一个十六进制字符, 代表一行四个相邻的二进制, 1代表像素, 0代表没有像素. 然后要求判断输入的是以下哪些图形 ...

  5. Vue如何在data中正常引入图片路径

    在Vue项目中通过data设置图片路径,然后在template中引入后页面无法显示图片,浏览器控制台报错:                        刚开始以为是路径出问题了,于是绝对路径.相对路 ...

  6. STM32F407 IO引脚复用器和映射 个人笔记

    基本概念 stm32有一些内置外设,每个外设有一个复用功能AF(Alternate functions). stm32的每个io引脚东路有一个16路复用器,该复用器一端连该引脚,另外16端连AF0~A ...

  7. C51 继电器 个人笔记

    一句话 小电流控制大电流的开关. 电路图 给J2端口一个低电平,三极管导通,线圈吸合 一般用P1^4口连接 #include <reg51.h> #define u16 unsigned ...

  8. MVC Ajax.BeginForm重复提交解决方法

    mvc使用MVC Ajax.BeginForm提交的时候有重复提交结果的时候检查相关js文件引用情况, 其中mvc4注意 1 2 3 4 @Scripts.Render("~/bundles ...

  9. js格式化日期时间

    // 对Date的扩展,将 Date 转化为指定格式的String // 月(M).日(d).周(E).小时(h).分(m).秒(s).季度(q) 可以用 1-2 个占位符, // 年(y)可以用 1 ...

  10. mkswap,swapon, swapoff命令:创建交换分区

    linux支持虚拟内存,用作虚拟内存的硬盘部分被称为交互空间(swap space),虚拟内存是指使用磁盘当作内存的扩展,这样可用内存的大小就相应的增大了.内核会将暂时不用的内存块的内容写到硬盘上,从 ...