奶牛晒衣服

【问题描述】
在熊大妈英明的带领下,时针和他的同伴生下了许多牛宝宝。熊大妈决定给每个宝宝都穿上可爱的婴儿装。于是,为牛宝宝洗晒衣服就成了很不爽的事情。圣人王担负起了这个重任。洗完衣服后,你就要弄干衣服。衣服在自然条件下用1 的时间可以晒干A 点湿度。抠门的熊大妈买了1 台烘衣机。使用烘衣机可以让你用1 的时间使1件衣服除开自然晒干的A 点湿度外,还可烘干B 点湿度,但在1 的时间内只能对1 件衣服使用。
N 件的衣服因为种种原因而不一样湿,现在告诉你每件衣服的湿度,要你求出弄干所有衣服的最少时间(湿度为0 为干)。
【输入格式】
第一行N , A , B , 接下来N 行, 每行一个数, 表示衣服的湿度( 1<= 湿度,A,B<=500000,1<=N<=500000)。
输出格式
一行,最少时间。
输入样例】Dry.in
3 2 1
1
2
3
输出样例】Dry.out
1
样例解析
第1 个时间内,用机器处理第3 件衣服,此外,所有衣服自然晒干2。花费1 时间全部弄干。

 

 

这是一道贪心的题,只要每次将湿度最大的衣服放进烘衣机即可。

不过还要考虑每一件衣服都能自然烘干,那是不是要在每一个时间后都把所有衣服减去 A 呢?这样的话,时间复杂度就太大了。其实只要开一个变量,每一个时间后把这个变量加上 A,然后若一件衣服的湿度小于等于这个变量,就说明已经烘干了。

还有,每一次取最小,不一定每一次都要在重新排序一遍,只要开一个优先队列就行。

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<queue>
 7 using namespace std;
 8 #define rep(i, a, n) for(int i = a; i <= n; ++i)
 9 #define per(i ,n, a) for(int i = n; i >= a; --i)
10 typedef long long ll;
11 int n, all, ext;
12 int tim = 0, down = 0;
13 priority_queue<int>q;
14 int main()
15 {
16     freopen("dry.in", "r", stdin);
17     freopen("dry.out", "w", stdout);
18     scanf("%d%d%d", &n, &all, &ext);
19     rep(i, 1, n) {int x; scanf("%d", &x); q.push(x);}
20     while(!q.empty())
21     {
22         int temp = q.top(); q.pop();
23         if(temp <= down) break;            //说明所有衣服已经烘干了 
24         tim++; down += all;
25         temp -= ext; q.push(temp); 
26     }
27     printf("%d\n", tim);
28     return 0;
29 }

 

posted @ 2018-03-10 15:01  mrclr  阅读(176)  评论(0编辑  收藏  举报