奶牛晒衣服 题解

奶牛晒衣服(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时间全部弄干

—————————————————————分割线—————————————————————

法一:二分答案,检验是否合法即可。

 1 #include "iostream"
 2 
 3 using namespace std ;
 4 const int maxN = 5e5 + 1e3 ; 
 5 
 6 int arr[ maxN ] ;
 7 
 8 int N , A , B ;
 9 
10 inline int INPUT ( ) {
11         int x = 0 , f = 1 ; char ch = getchar ( ) ;
12         while ( ch < '0' || '9' < ch ) { if ( ch == '-' ) f = -1 ; ch = getchar ( ) ; }
13         while ( ch >= '0' && ch <= '9' ) { x = ( x << 1 ) + ( x << 3 ) + ch -'0' ; ch = getchar ( ) ; } 
14         return x * f ;
15 } 
16 
17 bool Check ( int mid ) {
18         int rest = 0 ;
19         for ( int i=1 ; i<=N ; ++i ) {
20                 int temp = arr[ i ] - A * mid ;
21                 if ( temp > 0 ) rest += ( temp + B - 1 ) / B ;
22                 if ( rest > mid ) return false ;
23         }
24         return true ;
25 }
26 int main ( ) {
27         freopen ( "dry.in" , "r" , stdin ) ; freopen ( "dry.out" , "w" , stdout ) ; 
28         N = INPUT ( ) ; A = INPUT( ) ; B = INPUT ( ) ;
29         for ( int i=1 ; i<=N ; ++i ) {
30                 arr[ i ] = INPUT ( ) ;
31         } 
32         int Ans = 0 ; 
33         int L = 0 , R = maxN ; 
34         while ( L <= R ) {
35                 int mid = L + R >> 1 ;
36                 if ( Check ( mid ) ){
37                         Ans = mid ; 
38                         R = mid - 1  ;
39                 }
40                 else 
41                         L = mid + 1 ; 
42         }
43         cout << Ans << endl ; 
44         return 0 ; 
45 }
View Code

法二:用堆优化,每次选出最大的一个。

 1 #include "bits/stdc++.h"
 2 
 3 using namespace std ;
 4 const int maxN = 1e5 + 1e3 ; 
 5 
 6 priority_queue< int , vector< int > , greater< int > > Q ;
 7 
 8 int INPUT ( ) {
 9         int x = 0 , f = 1 ; char ch = getchar ( ) ;
10         while ( ch < '0' || ch > '9' ) { if ( ch == '-' ) f = -1 ; ch = getchar ( ) ; } 
11         while ( ch <='9' && ch >= '0' ){ x = ( x << 1 ) + ( x << 3 ) + ch - '0' ; ch = getchar ( ) ; } 
12         return x * f ;
13 }
14 
15 int main ( ) {
16         int T = 0 ; 
17         //freopen ( "hah.in" , "r" , stdin ) ;
18         int N = INPUT ( ) , A = INPUT ( ) , B = INPUT ( ) ;
19         for ( int i=1 ; i<=N ; ++i ) Q.push( -INPUT ( ) ) ; 
20         while ( -Q.top( ) - T * A > 0 ) {
21                 int tmp = -Q.top( ) ;
22                 Q.pop( ) ;        
23                 Q.push( B - tmp ) ; 
24                 ++T ; 
25         }
26         cout << T << endl ;
27         return 0 ; 
28 }
View Code

 

2016-10-17 16:19:21

 

posted @ 2016-10-17 16:19  SHHHS  阅读(269)  评论(0编辑  收藏  举报