【问题描述】
在熊大妈英明的带领下,时针和他的同伴生下了许多牛宝宝。熊大妈决定给每个宝宝都穿上可爱的婴儿装。于是,为牛宝宝洗晒衣服就成了很不爽的事情。圣人王担负起了这个重任。洗完衣服后,你就要弄干衣服。衣服在自然条件下用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 }