hzau 1209 Deadline(贪心)

K.Deadline There are N bugs to be repaired and some engineers whose abilities are roughly equal. And an engineer can repair a bug per day. Each bug has a deadline A[i].

Question: How many engineers can repair all bugs before those deadlines at least? 1<=n<= 1e6. 1<=a[i] <=1e9

Input Description There are multiply test cases. In each case, the first line is an integer N , indicates the number of bugs. The next line is n integers indicates the deadlines of those bugs.

Output Description There are one number indicates the answer to the question in a line for each case.

Input 4 1 2 3 4

Output 1

排序,大于N的不用考虑,否则超时

贪心

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 const int MAXN = 1e6 + 5;
 5
 6 int a[MAXN];
 7 int b[MAXN];
 8 int tot;
 9
10 int main()
11 {
12     int n;
13     int i;
14     int j;
15     int maxB;
16     int lMaxB;
17
18     while (~scanf("%d", &n)) {
19         int n2 = n;
20         for (i = 0; i < n; ++i) {
21             scanf("%d", &a[i]);
22             if (a[i] >= n2) {
23                 --i;
24                 --n;
25             }
26         }
27         //cout << n << endl;
28         sort(a, a + n);
29
30         tot = 0;
31         b[tot++] = 1;
32         for (i = 1; i < n; ++i) {
33             maxB = -1;
34             for (j = 0; j < tot; ++j) {
35                 if (b[j] < a[i] && b[j] > maxB) {
36                     maxB = b[j];
37                     lMaxB = j;
38                     break;
39                 }
40             }
41
42             if (maxB == -1) {
43                 b[tot++] = 1;
44             } else {
45                 ++b[lMaxB];
46             }
47
48         }
49
50         printf("%d\n", tot);
51     }
52
53     return 0;
54 }

但是为什么用set写超时呢,不是应该比数组遍历查找要快吗?

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 const int MAXN = 1e6 + 5;
 5
 6 int a[MAXN];
 7
 8 struct cmp {
 9     bool operator()(int a, int b)
10     {
11         return a > b;
12     }
13 };
14 multiset<int, cmp> st;
15
16 int main()
17 {
18     int n;
19     int i;
20     multiset<int, cmp>::iterator it;
21     int tmp;
22
23     while (~scanf("%d", &n)) {
24         st.clear();
25         int n2 = n;
26         for (i = 0; i < n; ++i) {
27             scanf("%d", &a[i]);
28             if (a[i] >= n2) {
29                 --i;
30                 --n;
31             }
32         }
33         //cout << n << endl;
34         sort(a, a + n);
35
36         st.insert(1);
37         for (i = 1; i < n; ++i) {
38             it = st.upper_bound(a[i]);
39             if (it == st.end()) {
40                 st.insert(1);
41             } else {
42                 tmp = *it + 1;
43                 st.erase(it);
44                 st.insert(tmp);
45             }
46         }
47
48         printf("%d\n", st.size());
49
50     }
51
52     return 0;
53 }

时间: 2024-12-16 12:04:35

hzau 1209 Deadline(贪心)的相关文章

HZAU 18——Array C——————【贪心】

18: Array C Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 586  Solved: 104[Submit][Status][Web Board] Description Giving two integers  and  and two arrays  and  both with length , you should construct an array  also with length  which satisfied: 1.0

hdu1789Doing Homework again(贪心)

题目链接: 啊哈哈,点我点我 思路: 这道题是简单的贪心..先按分数从大到小排序,然后将这个分数的截止日期从后向前扫描,如果碰到没有被标记的则这一天可以做这个作业... 题目: Doing Homework again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 6451    Accepted Submission(s): 383

BZOJ_1620_[Usaco2008_Nov]_Time_Management_时间管理_(二分+贪心)

描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1620 N个工作,每个工作其所需时间,及完成的Deadline,问要完成所有工作,最迟要什么时候开始. 分析 我们可以想到二分开始的时间.对于一个给定的时间,判断是否可以完成. 如何判断呢? 我们假设有\(a,b\)两个任务且\(deadline(a)<deadline(b)\). 如果先完成\(b\),那么要求\(time[b]+time[a]<deadline(a)\). 如果先完成\(

POJ 1456 Supermarket 区间问题并查集||贪心

F - Supermarket Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 1456 Appoint description:  System Crawler  (2015-11-30) Description A supermarket has a set Prod of products on sale. It earns a p

poj_1456 贪心

题目大意 一家超市,要卖出N种物品(每种物品各一个),每种物品都有一个卖出截止日期Di(在该日期之前卖出可以获得收益,否则就无法卖出),且每种物品被卖出都有一个收益值Pi. 卖出每个物品需要耗时1天,且任一时刻只能卖出一个物品.给出这N种物品的Di和Pi,求最大收益值. 题目分析 求最优值问题,可以考虑动态规划.贪心.搜索+剪枝等算法.尝试用贪心法来分析.     考虑在日期D以及D之后卖出物品可以获得的最大收益,因为这样就可以只考虑售出截止日期Di>=D的那些物品了,类似于无后效性.日期D从m

贪心算法正确性证明(转载from刘子韬)

这里主要是介绍一种证明贪心算法是最优的一种方法:Exchange Argument (不知道应该怎么翻译到中文,交换参数?感觉听起来挺别扭的,不像是一个方法的名字~o(╯□╰)o) Exchange Argument的主要的思想也就是 先假设 存在一个最优的算法和我们的贪心算法最接近,然后通过交换两个算法里的一个步骤(或元素),得到一个新的最优的算法,同时这个算法比前一个最优算法更接近于我们的贪心算法,从而得到矛盾,原命题成立. 下面来看一个更为formal的解释: 步骤: Step0: 给出贪

HDU 4221 Greedy?(贪心啊啊)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4221 Problem Description iSea is going to be CRAZY! Recently, he was assigned a lot of works to do, so many that you can't imagine. Each task costs Ci time as least, and the worst news is, he must do thi

[BZOJ 1029] [JSOI2007] 建筑抢修 【贪心】

题目链接:BZOJ - 1029 题目分析 使用一种贪心策略. 现将任务按照deadline从小到大排序. 然后枚举每一个任务,如果当前消耗的时间加上完成这个任务的时间不会超过这个任务的deadline,那么就完成这个任务. 否则,如果完成这个任务的时间比之前选择完成的任务中完成时间最长的一个要短,那么就弹出之前完成的那个任务,换上当前的这个任务. 这样当前的答案没有变,当前消耗的时间却减少了. 用堆来实现取最大值的操作. 代码 #include <iostream> #include <

(贪心 + 并查集优化) poj 1456

Supermarket Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9452   Accepted: 4067 Description A supermarket has a set Prod of products on sale. It earns a profit px for each product x∈Prod sold by a deadline dx that is measured as an int