【题目背景】
猪妈妈生病了,于是家里堆了好多衣服没有洗。露娜担负起了这个重任。洗完衣服后,她就要弄干衣服。衣服在自然条件下用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 }