NOIP2012模拟试题【奶牛晒衣服】
1.奶牛晒衣服(dry)
【问题描述】
在熊大妈英明的带领下,时针和它的同伴生下了许多牛宝宝。熊大妈决定给每个宝宝都穿上可爱的婴儿装。于是,为牛宝宝洗晒衣服就成了很不爽的事情。
圣人王担负起了这个重任。洗完衣服后,你就要弄干衣服。衣服在自然条件下用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时间全部弄干。
刚拿到题的时候以为是dp,TAT因为一大早就和和另一个妹子在看容斥原理,满脑子都是dp(/手动再见,我就是这么蠢)
后来才知道是非!常!简!单!的一个队列题!啊啊啊啊啊啊啊啊l(っ*´Д`)っ!
(为啥我这么蠢啊!)
因为随着时间的增加,只要没有晾干的衣服都会进行湿度-a的操作,所以我们可以直接用一个变量sum来记录总共要减去的湿度,就不需要每次都把每件衣服都减去a了
下面的代码有足够的注释=v=不再多说
1 #include<cstdio> 2 #include<cstring> 3 #include<queue> //*** 4 #include<algorithm> 5 using namespace std; 6 priority_queue<int>q;//*** 7 int n,a,b; 8 int w; 9 void read() 10 { 11 scanf("%d%d%d",&n,&a,&b); 12 int w; 13 for(int i=1;i<=n;i++) 14 { 15 scanf("%d",&w); 16 q.push(w);//将湿度入队; 17 } 18 int sum=0; 19 int t=0; 20 while(!q.empty())//如果队列不为空,即还有衣服没晾干; 21 { 22 int k=q.top(); 23 if(k<=sum){ 24 printf("%d",t); 25 return; 26 }//如果无需烘干,即当前的自然晒干的湿度的总和>衣服的湿度,直接打印; 27 else{//需要烘干机; 28 q.pop(); 29 k-=b;//烘干机操作后的湿度; 30 sum+=a;//自然晒干的湿度的总和等于这一次操作之前适度的总和加这一次的晒干的湿度; 31 t++;//时间加一; 32 q.push(k);//将k再次入队判断(因为k还没有晾干所以还需要更多的时间) 33 } 34 } 35 printf("%d",t); 36 } 37 int main() 38 { 39 freopen("dry.in","r",stdin); 40 freopen("dry.out","w",stdout); 41 read(); 42 }