UVALive 3507:Keep the Customer Satisfied(贪心 Grade C)
题意:
知道n(n <= 8e6)个工作的完成所需时间q和截止时间d,你一次只能做一个工作。问最多能做多少工作?
思路:
首先很像贪心。观察发现如下两个贪心性质:
1)一定存在一个最优方案,使得截止时间靠后的工作一定比截止时间靠前的工作迟完成(如果完成的话)
证明:
若工作i, j 有 d[i] > d[j]。假设我们现在有一个工作方案,使得i工作在j工作之前完成。
如 ..., i , ... , j , ...
记做 preI, i, midIJ, j, afterJ
此时将这个工作方案的i移动到j后面一个完成,其他不动。
则变成 preI , midIJ , j , i , afterJ
如此交换对 preI和afterJ 部分不会有影响。
对于midIJ部分,由于i的抽出,使得整体完成时间前移,所以不会导致结果更差。
对于j,原先在截止时间内,现在抽出了i,所以一定也在截止时间内。
对于i,因为d[i] > d[j],而现在i的完成时间等同于原先j的完成时间,所以i也一定能完成。
所以这个交换方案不会使得结果更差。
至于会不会变得更好,没有证明,感觉会吧~~迟一点的可以拖一下嘛。。。
2)若存在一种方案,使得 d[i] < d[j] 且 q[i] > q[j] 且选择了i而没有选择j, 则一定可以用j代替i。
证明:略。
所以采用如下贪心策略:
按d从小到大排序,然后依次放入。若放入后爆炸,则看一下前面最大的那个,如果最大的比这个大,踹走后,把这个放进去。
【注:本题证明不完备。可能有问题。如有发现,多谢指正】
坑点:忘记两组数据之间有空行。。。
代码:
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std; #define N 800100 struct Work{
int q, d;
void read() {
scanf("%d%d", &q, &d);
}
bool operator < (const Work &b) const {
if (d != b.d) return d < b.d;
return q < b.q;
}
}works[N]; priority_queue<int> que; int main() {
int t;
scanf("%d", &t);
int _ = ;
while (t--) {
!_++?:puts("");
int n;
scanf("%d", &n);
for (int i = ; i < n; i++) {
works[i].read();
} sort(works, works+n); while (!que.empty()) que.pop();
int now = ;
int cnt = ;
for (int i = ; i < n; i++) {
if (now + works[i].q <= works[i].d) {
now += works[i].q;
que.push(works[i].q);
cnt++;
} else {
if (!que.empty() && works[i].q < que.top()) {
now -= que.top();
now += works[i].q;
que.pop();
que.push(works[i].q);
}
}
}
printf("%d\n", cnt);
}
return ;
}
UVALive 3507:Keep the Customer Satisfied(贪心 Grade C)的更多相关文章
- UVALive - 3507 Keep the Customer Satisfied
题意:收到n个订单,每个订单有q,d分别代表做这个的时间,和最晚的完成时间,问你最多能接受几个订单 思路:贪心,我们显然要按最早的完成时间排序,那么接下来,我们用(6,8)和(4,9)做为例子,按照我 ...
- UVA1153-Keep the Customer Satisfied(贪心)
Problem UVA1153-Keep the Customer Satisfied Accept: 222 Submit: 1706Time Limit: 3000 mSec Problem D ...
- UVA - 1153 Keep the Customer Satisfied(贪心)
UVA - 1153 Keep the Customer Satisfied Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: ...
- poj 2786 - Keep the Customer Satisfied
Description Simon and Garfunkel Corporation (SG Corp.) is a large steel-making company with thousa ...
- UVA-1153 Keep the Customer Satisfied (贪心)
题目大意:有n件工作,做每件工作的消耗时间为s,截止时间为d,问最多能做完几件工作. 题目分析:贪心策略:优先做截止时间靠前的,一旦做不完当前工作,则从已经做过的工作中删去一件耗时最长的,用当前工作取 ...
- UVa 1153 Keep the Customer Satisfied (贪心+优先队列)
题意:给定 n 个工作,已知每个工作要用的时间 q 和 截止时间 d,问你最多完成多少个工作,每次最多能运行一个工作. 析:这个题是贪心,应该能看出来,关键是贪心策略是什么,这样想,先按截止时间排序, ...
- UVALive 3835:Highway(贪心 Grade D)
VJ题目链接 题意:平面上有n个点,在x轴上放一些点,使得平面上所有点都能找到某个x轴上的点,使得他们的距离小于d.求最少放几个点. 思路:以点为中心作半径为d的圆,交x轴为一个线段.问题转换成用最少 ...
- 【uva 1153】Keep the Customer Satisfied(算法效率--贪心+优先队列)
题意:有N个工作,已知每个工作需要的时间和截止时间.要求所有工作穿行完成,第一项任务开始的时间不早于时刻0.问最多能完成多少个工作.(N≤800000) 解法:贪心.可以模型化题目为:已知N个任务的长 ...
- UVa 1153 Keep the Customer Satisfied 【贪心 优先队列】
题意:给出n个工作,已知每个工作需要的时间last,以及截止时间end,(必须在截止时间之前完成)问最多能够完成多少个工作 首先预处理,将这n件任务按照截止时间从小到大排序 然后用一个cur记录当前做 ...
随机推荐
- Android 文件管理器通用类 FileUtil
1.整体分析 1.1.源代码如下,可以直接Copy. public class FileUtil { private FileUtil() { } //****系统文件目录************** ...
- 20145202 《Java程序设计》实验四实验报告
实验名称 Andoid开发基础 实验内容 1.基于Android Studio开发简单的Android应用并部署测试; 2.了解Android组件.布局管理器的使用: 3.掌握Android中事件处理 ...
- python-openpyxl操作excel
python 读写 excel有很多选择,但是,方便操作的库不多,在我尝试了几个库之后,我觉得两个比较方便的库是xlrd/xlwt.openpyxl. 之所以推荐这两个库是因为这两个库分别操作的是不同 ...
- Kafka写入流程和副本策略
Kafka写入流程: 1.producer 先从 zookeeper 的 "/brokers/.../state" 节点找到该 partition 的 leader 2. prod ...
- 剑指Offer - 九度1352 - 和为S的两个数字
剑指Offer - 九度1352 - 和为S的两个数字2014-02-05 18:15 题目描述: 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于 ...
- 剑指Offer - 九度1388 - 跳台阶
剑指Offer - 九度1388 - 跳台阶2013-11-24 03:43 题目描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 输入: 输入可能包 ...
- 《Cracking the Coding Interview》——第16章:线程与锁——题目5
2014-04-27 20:16 题目:假设一个类Foo有三个公有的成员方法first().second().third().请用锁的方法来控制调用行为,使得他们的执行循序总是遵从first.seco ...
- day-python入门3
本节内容 鸡汤.电影 IDE介绍 知识回顾 数据类型 For循环 while循环 列表及常用操作 IDE介绍 IDE即集成开发环境 常见IDE Visualstudio : w ...
- vue零碎收集
在组件中创建dom: let a=document.querySelector('.test'); let newDom=document.createElement("div") ...
- Python全栈工程师(迭代器、字节串)
ParisGabriel 每天坚持手写 一天一篇 决定坚持几年 为了梦想为了信仰 Python人工智能从入门到精通 迭代器 Iterator: 用<&g ...