露娜晒衣服

【题目背景】

猪妈妈生病了,于是家里堆了好多衣服没有洗。露娜担负起了这个重任。洗完衣服后,她就要弄干衣服。衣服在自然条件下用1的时间可以晒干A点湿度。而作为贫穷百姓的露娜用她攒了多年的零花钱买了1台烘衣机。使用烘衣机可以让你用1的时间使1件衣服除开自然晒干的A点湿度外,还可烘干B点湿度,但在1的时间内只能对1件衣服使用。

【题目描述】

N件的衣服因为种种原因而不一样湿,现在告诉你每件衣服的湿度,要你求出弄干所有衣服的最少时间(湿度为0位干)

【输入格式】

第一行N,A,B,接下来N行,每行一个数,表示衣服的湿度(1<=湿度,A,B,M<=500000,1<=N<=500000).

【输出格式】

一行,最少时间

【输入样例】Dry.in

3 2 1

1

2

3

4

5

【输出样例】Dry.out

1

【样例解析】

第1个时间内,用极其处理第3件衣服,此外,所有衣服自然晒干2.花费1时间全部弄干

【胡乱分析】

在输入完每件衣服的湿度后,对湿度进行排序,对湿度最大的衣服开始烘干,同时其它衣服的湿度减去自然晾干的点数。。。。这个方法显然过不了数据范围啊。所以换一种思路。在输入时,记录一个湿度对应的衣服有多少件。然后对湿度最大的衣服进行烘干,这样湿度最大的衣服便减少了一件,由于它只烘干了b点,是不是完全烘干并不知道,所以湿度为[最大湿度-b]的衣服增加了一件。那么直到湿度最大的衣服都没有了,这时新的最大湿度便是下一个了。

【代码参考】

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cmath>
 5 #include<cstring>
 6 #include<queue>
 7 using namespace std; 
 8 priority_queue<int>q;//优先队列 
 9 int main()
10 {
11         freopen("dry.in","r",stdin);
12         freopen("dry.out","w",stdout);
13     int n,a,b,shidu;
14         int t=0,k=0;
15     scanf("%d%d%d",&n,&a,&b);
16     for(int i = 1;i <= n;i++)
17     {
18         scanf("%d",&shidu);
19         q.push(shidu);
20     }
21     while(!q.empty())
22     {
23         int max = q.top();//烘干当前湿度最大的衣服 
24         q.pop();//当前湿度最大的衣服减少一件 
25         if(k >= max)break;//当所有衣服都干了时,退出循环 
26         max -= b;//烘干后的湿度 
27         q.push(max);//相应适度的衣服增加一件 
28         k += a;//所有衣服自然晾干数 
29         t++;//记录时间 
30     }
31     printf("%d",t);
32     return 0;
33 }
原文地址:https://www.cnblogs.com/peppa/p/8546861.html