奶牛晒衣服 题解
奶牛晒衣服(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 }
法二:用堆优化,每次选出最大的一个。
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 }
2016-10-17 16:19:21