今天是因为David Lee正好讲这个题的类似题,我才做了一下。

本题是world final 2016的一道水……

题目地址如下

http://www.lydsy.com/JudgeOnline/problem.php?id=4619.

这道题目让我们求为格式化所有硬盘所需要买的最小的额外空间。

这道题目很容易能看出来是一道贪心题目(据David Lee说还有一种做法是二分+贪心,不过qdez的师天硕stonepage和我Icontofig都觉得二分+贪心有些麻烦,然而stonepage不打算写,那就由我来写这一篇题解报告)。

那我们该怎么贪心呢?

第一种想法:我们看格式化后与格式化前的差值的大小来拍一遍序,然后加起来(剩余空间)看看最后我们需要多少额外空间(剩余空间是负数)。这个想法很容易被Hack掉,自己手写一组加起来大于0的就可以Hack,因为你一开始的磁盘空间是0

第二种想法:我们先把格式化后与格式化前的差值大于0的加在一起,然后再根据每个磁盘的a值升序操作剩下的。这个也很容易hack掉,比如突然就来了一个格式化前空间非常大的,这种做法就懵逼了。

第三种想法:那我把第二种想法倒过来,行不行呢?显然不行,有些数据随随便便就可以hack掉你。

那应该怎么做?

正解:

我们对于输入的数据进行预处理,把格式化后与格式化前的差值大于0的放在一个结构体里面,把小于0的放在一个结构体里。

先处理大于0的,对其根据b值进行升序排列,然后模拟过程(设一开始的剩余空间为0),用sum记录过程中出现的最小负值,再用ans记录剩余空间(就是待会儿程序里面的co)。

再处理小于0的,同上操作(不过这时候剩余空间不是0了,上面操作已经更改过了);

然后sum的绝对值就是我们想要的答案啦!具体证明明天我再问问stonepage;

具体代码如下

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <cstdlib>
using namespace std;
typedef long long LL;
const int maxn = ;
struct SD{
LL a,d;
}p[maxn];
struct counter{
LL a,b,co;
}pluss[maxn],dece[maxn];
bool cmp1(counter a,counter b){
return a.b < b.b;
}
bool cmp2(counter a,counter b){
return a.a > b.a;
}
LL n,ans,sum,now1,now2;
LL get_num(){
LL num = ;
char c;
bool flag = false;
while((c = getchar()) == ' ' || c == '\n' || c == '\r');
if(c == '-')flag = true;
else num = c - '';
while(isdigit(c = getchar()))
num = num * + c - '';
return (flag ? - : ) * num;
}
void init(){
memset(p,,sizeof(p));
memset(pluss,,sizeof(pluss));
memset(dece,,sizeof(dece));
now1 = now2 = ;
}
int main(){
init();
n = get_num();
for(int i = ;i <= n;++i){
p[i].d = get_num();
p[i].a = get_num();
if(p[i].a >= p[i].d){
pluss[++now1].a = p[i].a;
pluss[now1].b = p[i].d;
pluss[now1].co = p[i].a - p[i].d;
}
else{
dece[++now2].a = p[i].a;
dece[now2].b = p[i].d;
dece[now2].co = p[i].a - p[i].d;
}
}
sort(pluss+,pluss+now1+,cmp1);
sort(dece+,dece+now2+,cmp2);
for(int i = ;i <= now1;++i){
sum = min(sum,ans - pluss[i].b);
ans += pluss[i].co;
}
for(int i = ;i <= now2;++i){
sum = min(sum,ans - dece[i].b);
ans += dece[i].co;
}
printf("%lld\n",abs(sum));
return ;
}

如果大家对我的博客有所意见,请通过我的邮箱联系我,谢谢。

BZOJ 4619 Swap Space 解题报告的更多相关文章

  1. BZOJ 1367 [Baltic2004]sequence 解题报告

    BZOJ 1367 [Baltic2004]sequence Description 给定一个序列\(t_1,t_2,\dots,t_N\),求一个递增序列\(z_1<z_2<\dots& ...

  2. BZOJ 2839: 集合计数 解题报告

    BZOJ 2839: 集合计数 Description 一个有\(N\)个元素的集合有\(2^N\)个不同子集(包含空集),现在要在这\(2^N\)个集合中取出若干集合(至少一个),使得 它们的交集的 ...

  3. BZOJ 球形空间产生器 解题报告(高斯消元)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1013 1013: [JSOI2008]球形空间产生器sphere 有一个球形空间产生器能 ...

  4. BZOJ 1044 木棍分割 解题报告(二分+DP)

    来到机房刷了一道水(bian’tai)题.题目思想非常简单易懂(我的做法实际上参考了Evensgn 范学长,在此多谢范学长了) 题目摆上: 1044: [HAOI2008]木棍分割 Time Limi ...

  5. BZOJ 4341 [CF253 Printer] 解题报告

    乍一看这个题好像可以二分优先度搞搞... 实际上能不能这么搞呢...? 我反正不会... 于是开始讲我的乱搞算法: 首先肯定要把任务按照优先度排序. 用一棵在线建点的线段树维护一个时刻是否在工作. 然 ...

  6. BZOJ 4036 [HAOI2015] Set 解题报告

    首先我们不能一位一位的考虑,为什么呢? 你想想,你如果一位一位地考虑的话,那么最后就只有 $n$ 个数字,然而他给了你 $2^n$ 个数字,怎么看都不对劲呀.(我是因为这样子弄没过样例才明白的) 所以 ...

  7. BZOJ 3288 Mato矩阵 解题报告

    这个题好神呀..Orz taorunz 有一个结论,这个结论感觉很优美: $$ans = \prod_{i=1}^{n}\varphi(i)$$ 至于为什么呢,大概是这样子的: 对于每个数字 $x$, ...

  8. BZOJ 4123 [Baltic2015] Hacker 解题报告

    首先,Alice 会选择一个长度为 $\lfloor\frac{n+1}{2}\rfloor$ 的区间,我们把这个长度记为 $len$. 有这么一个结论:令 $F_i$ 为覆盖 $i$ 点的所有长度为 ...

  9. BZOJ 4146 [AMPPZ2014] Divisors 解题报告

    这个题感觉比较小清新... 我们记录每个数出现的次数 $T_i$. 首先依次枚举每个数字,令 $ans = ans + T_i \times (T_i - 1)$,然后枚举这个数的倍数,令 $ans ...

随机推荐

  1. Atitit 理解Monad attilax总结

    Atitit 理解Monad attilax总结 但函数式编程最大的一个问题是,函数是一个数学抽象,在现实世界中不存在,1 那既然这样就够用了,还要 Monad 干嘛?Monad 的作用在这里就体现出 ...

  2. Atitit 修改密码的功能流程设计 attilax总结

    Atitit 修改密码的功能流程设计 attilax总结 1.1. 注意点1 1.2. 设计修改用户密码功能时把用户ID保存在哪里?1 1.3. Ui设计1 1.4. 功能设计源码1 1.5. Agt ...

  3. python学习 变量的操作 与 基本数据类型

    一变量(本文使用python3.5): #变量:是计算机内存中的一块区域,变量可以存储规定范围内的值,变量可以改变#在python中变量是计算机内存中数据的引用 python的变量没有明显的类型,具体 ...

  4. 转:Acegi Security

    Acegi Security -- Spring下最优秀的安全系统 http://www.springside.org.cn/docs/reference/Acegi.htm 1. Acegi 介绍 ...

  5. Html与CSS快速入门01-基础概念

    Web前端技术一直是自己的薄弱环节,经常为了调节一个简单的样式花费大量的时间.最近趁着在做前端部分的开发,果断把这部分知识成体系的恶补一下.内容相对都比较简单,很类似工具手册的学习,但目标是熟练掌握. ...

  6. 微软BI 之SSIS 系列 - 使用 SQL Profilling Task (数据探测) 检测数据源数据

    开篇介绍 SQL Profilling Task 可能我们很多人都没有在 SSIS 中真正使用过,所以对于这个控件的用法可能也不太了解.那我们换一个讲法,假设我们有这样的一个需求 - 需要对数据库表中 ...

  7. TSql Output 用法

    第一部分:TSql Output 关键字有两种应用场景 1,作为存储过程的参数类型,从存储过程中返回数据 2,返回受 INSERT.UPDATE.DELETE 或 MERGE 语句影响的各行中的信息, ...

  8. 解析大型.NET ERP系统 20条数据库设计规范

    数据库设计规范是个技术含量相对低的话题,只需要对标准和规范的坚持即可做到.当系统越来越庞大,严格控制数据库的设计人员,并且有一份规范书供执行参考.在程序框架中,也有一份强制性的约定,当不遵守规范时报错 ...

  9. maven+spring+springMVC+mybatis+dubbox

      milestone 2016612  dubbox+spring+mybatis provider调通

  10. php的几种运行模式CLI、CGI、FastCGI、mod_php

    1.CLI:就是命令行,例如可以在控制台或者是shell中键入命令: php -f index.php 然后获取输出 2.CGI:以下是不同的说法与理解 公共网关接口”(Common Gateway  ...