本来以为这道题是考不相交区间, 结果还专门复习了一遍前面写的, 然后发现这道题的区间是不是

固定的, 是在一个范围内“滑动的”, 只要右端点不超过截止时间就ok。

然后我就先考虑有包含关系的时候怎么选, 然后发现当两个区间只能放一个的时候时间更短而截

至时间更长的时候,显然更优。然后我就试着每个区间放的时候后后面的比较, 如果两个区间只能放一个, 而且

下个区间更优, 那么当前的就不选。然后排除掉这些区间之后, 能选的就选。

交上去WA。然后我发现中间的区间排除了,但是前面和后面的区间可能会矛盾, 也要排除

我就想不到什么方法来实现了。

后来参考了https://blog.csdn.net/u013520118/article/details/48008741

发现我其实已经想了80%了, 但是最后20%怎么实现没有想到。这里用到优先队列来实现,

优先队列中储存了之前已经放过的所有区间, 然后能放就放, 不能放就往前和已经放了

的区间比较, 更优的话就放当前的区间, 取消之前的区间。

一直怎么做就可以了。这么做为什么可以呢, 因为这样就可以考虑到所有区间之间的“包含”关系


让所有区间里面最不优的都舍去了, 所以最后答案就是最优的。


然后我就继续想, 为什么紫书前面讲区间的时候都是相邻的比较来舍去, 而这个要考虑前面所有


放过的区间。


然后我发现, 紫书上选区间的时候是前一个比后一个更优的。


然而这道题,放的时候相邻的两个区间不一定前一个优于后一个, 因为就算后一个更差, 只要

不超过截止时间, 就可以放。


那么这就导致了, 这道题排在后面的区间显然不一定优于前面的区间(优指时间更短且截止时间更后),


所以不具有连续性, 也就是说要考虑当前区间和前面所有区间里面“最差”的那一个, 也就是需要时间最长


的一个来取最优, 所以这才证明了贪心的正确性。


我觉得自己讲得非常抽象, 看不懂也可以简单的理解为能放就放, 不能放就拿一个最差的来换, 这样结果

肯定是最优的。

#include<cstdio>
#include<queue>
#include<algorithm>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
using namespace std; const int MAXN = 812345;
struct node
{
int d, q;
bool operator < (const node& x) const
{
return q < x.q;
}
}a[MAXN]; bool cmp(node a, node b)
{
return a.d < b.d;
} int main()
{
int T, n;
scanf("%d", &T); while(T--)
{
priority_queue<int> Q;
scanf("%d", &n);
REP(i, 0, n) scanf("%d%d", &a[i].q, &a[i].d);
sort(a, a + n, cmp); int start = 0;
REP(i, 0, n)
{
if(start + a[i].q <= a[i].d) start += a[i].q, Q.push(a[i].q);
else if(Q.size() && a[i].q < Q.top())
{
start += a[i].q - Q.top();
Q.pop(); Q.push(a[i].q);
}
} printf("%d\n", Q.size());
if(T) puts("");
} return 0;
}

紫书 习题8-12 UVa 1153(贪心)的更多相关文章

  1. 紫书 习题 11-9 UVa 12549 (二分图最小点覆盖)

    用到了二分图的一些性质, 最大匹配数=最小点覆盖 貌似在白书上有讲 还不是很懂, 自己看着别人的博客用网络流写了一遍 反正以后学白书应该会系统学二分图的,紫书上没讲深. 目前就这样吧. #includ ...

  2. 紫书 习题 11-8 UVa 1663 (最大流求二分图最大基数匹配)

    很奇怪, 看到网上用的都是匈牙利算法求最大基数匹配 紫书上压根没讲这个算法, 而是用最大流求的. 难道是因为第一个人用匈牙利算法然后其他所有的博客都是看这个博客的吗? 很有可能-- 回归正题. 题目中 ...

  3. 紫书 习题8-7 UVa 11925(构造法, 不需逆向)

    这道题的意思紫书上是错误的-- 难怪一开始我非常奇怪为什么第二个样例输出的是2, 按照紫书上的意思应该是22 然后就不管了,先写, 然后就WA了. 然后看了https://blog.csdn.net/ ...

  4. 紫书 习题 8-15 UVa 1617 (贪心)

    先排序, 然后每个线段先放右端点, 然后往下放, 如果不能放就整体往左移动, 当不能往左移动的时候就ans++ 开始下一个整块.判断能不能向左移动要用一个变量储存每个已经放了的区间中线段与左端点距离的 ...

  5. 紫书 习题 8-13 UVa 10570 (枚举+贪心)

    我看到数据范围只有500, 第一反应枚举所有的可能,然后求出每种可能的最小次数. 但是不知道怎么求最小次数.我想的是尽量让一次交换可以让两个不在应该在的位置的数字 到原来应该在的位置的数字, 这样可以 ...

  6. 紫书 习题8-8 UVa 1612 (贪心+精度)

    这道题我很快就写出来了, 但是一直WA, 然后发现是精度, 这坑了我一个小时-- (1)贪心.每次就尽量分数高, 可以保证最后分数最高 (2)神tm精度问题.记住判断大于小于和等于的时候要用EPS(1 ...

  7. 紫书 习题8-4 UVa 11491 (贪心)

    题意:给你一个数, 要求删去一些数字, 使得剩下的数字最大. 这道题用贪心解决. 大家想一想, 两个数比较大小, 肯定先比较第一位的数,然后依次比较第二位,以此类推. 既然我们要保证最后的数字最大, ...

  8. 紫书 习题 8-23 UVa 1623 (set妙用 + 贪心)

    这道题我是从样例中看出思路了 2 4 0 0 1 1 看这组数据, 输出的是No, 为什么呢?因为两个1之间没有神龙喝水, 所以一定会有水灾. 然后就启发了我,两次同一个湖的降水之间必须至少有一次神龙 ...

  9. 紫书 习题8-10 UVa 1614 (贪心+结论)

    这道题我苦思冥想了一个小时, 想用背包来揍sum/2, 然后发现数据太大, 空间存不下. 然后我最后还是去看了别人的博客, 发现竟然有个神奇的结论-- 幸好我没再钻研, 感觉这个结论我肯定是想不到的- ...

随机推荐

  1. javascript编程风格(粗略笔记)

    1.空格 紧凑型: project.MyClass = function(arg1, arg2){ 松散型: for( i = 0; i < length; i++ ){ 2.代码行长度 最多8 ...

  2. 利用Arcade表达式显示多行标签

    要素图层依然是全球气象站点分布数据,属性表如下: 展示效果如下,显示的四行数据分别是属性表中的WIND_NAME,TEMP,WIND(运算之后的),R_HUMIDITY 本次尝试一次性写全所有的信息: ...

  3. POJ 2356 Find a multiple( 鸽巢定理简单题 )

    链接:传送门 题意:题意与3370类似 注意:注意输出就ok,输出的是集合的值不是集合下标 /***************************************************** ...

  4. 【BZOJ 1297】[SCOI2009]迷路

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 如果点与点之间的距离都是1的话. 那么T次方之后的矩阵上a[1][n]就是所求答案了. 但是这一题的边权可能会大于1 但最多为10 ...

  5. Windows环境下教你用Eclipse ADT 插件生成.h/.so文件,Java下调用JNI,轻松学习JNI

    准备工作:Eclipse ADT IDE 开发工具,NDK .Java 环境,博主的配置是:Windows x86 , ADT Build: v22.3.0-887826 , JAVA 1.7, ND ...

  6. Web前端国际化之jQuery.i18n.properties

    Web前端国际化之jQuery.i18n.properties jQuery.i18n.properties介绍 国际化是如今Web应用程序开发过程中的重要一环,jQuery.i18n.propert ...

  7. BZOJ2154: Crash的数字表格 & BZOJ2693: jzptab

    [传送门:BZOJ2154&BZOJ2693] 简要题意: 给出n,m,求$\sum_{i=1}^{n}\sum_{j=1}^{m}LCM(i,j)$ 题解: 莫比乌斯反演(因为BZOJ269 ...

  8. bzoj2756: [SCOI2012]奇怪的游戏(网络流+分情况)

    2756: [SCOI2012]奇怪的游戏 题目:传送门 题解: 发现做不出来的大难题一点一个网络流 %大佬 首先黑白染色(原来是套路...)染色之后就可以保证每次操作都一定会使黑白各一个各自的值加1 ...

  9. 子文件夹的遍历(python、matlab)

    1. python 使用 os.listdir:Python Tricks(九)-- 递归遍历目录下所有文件 使用 os.walk: os.walk返回的是生成器(Generator),需迭代访问: ...

  10. 3.多线程传参,以及tuple数组

    #include <Windows.h> #include <thread> #include <iostream> #include <tuple> ...