奶牛曬衣服(題解)
阿新 • • 發佈:2018-03-10
typedef 愛的 所有 utc IT ++ cstring 奶牛 spa
奶牛曬衣服
【問題描述】
在熊大媽英明的帶領下,時針和他的同伴生下了許多牛寶寶。熊大媽決定給每個寶寶都
穿上可愛的嬰兒裝。於是,為牛寶寶洗曬衣服就成了很不爽的事情。
聖人王擔負起了這個重任。洗完衣服後,你就要弄幹衣服。衣服在自然條件下用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 時間全部
弄幹。
這道題用貪心即可解答:排序,取每次最大的濕度的衣服來烘幹,自然風幹後再次排序,以此類推,直到最大濕度的衣服濕度值為<0的為止。
當然,這個的復雜度我也只能呵呵了,於是想到了每次不用把所有衣服的濕度值都減去,只要記錄總共減去的濕度值和最大濕度的衣服進行比較即可,當減去濕度值大於等於最大濕度就可以輸出。雖然減少了一次循環,但兩次排序的2 * nlogn 的復雜度也不能過完50W的數據。
因此,我們就想到了一個排序復雜度很低的數據結構——優先隊列,它會把放入的元素默認從小到大排序,單次插入刪除的復雜度僅為logn,所以時間就不怕超了。
下面附上各個AC、沒AC的代碼:
#include <iostream> #include<cstdio> #include <cstring> #include <string> #include <algorithm> #include <cmath> #include <cstdlib> using namespace std; #define zxy(i , a , b) for(ll i = a ; i <= b ; i ++) #define zxyzxy(i , a , b) for(ll i = a ; i < b ; i ++) #define yxz(i , a , b) for(ll i = a ; i >= b ; i --) #defineyxzyxz(i , a , b) for(ll i = a ; i > b ; i --) #define N 500010 typedef long long ll; ll read() { ll ans = 0; char ch = getchar(),last = ‘ ‘; while(ch < ‘0‘ || ch > ‘9‘) last = ch , ch = getchar(); while(ch >= ‘0‘ && ch <= ‘9‘) ans = ans * 10 + ch - ‘0‘ , ch = getchar(); if(last == ‘-‘) ans = -ans; return ans; } void put(ll x) { if(x < 0) { putchar(‘-‘); x = -x; } if(x == 0) { putchar(‘0‘); return; } ll q[100] , nn = 0; while(x) q[++ nn] = x % 10 , x /= 10; while(nn) putchar(‘0‘ + q[nn]), --nn; } ll n,a,b,t; ll sd[N]; ll ans = 0; ll op = 0; int main() { //freopen("dry.in","r",stdin); //freopen("dry.out","w",stdout); n = read(); a = read(); b = read(); zxy(i , 1 , n) { sd[i] = read(); /*put(sd[i]); printf("\n");*/ } sort(sd + 1 , sd + n + 1); while(1) { sd[n] -= b; op += a; sort(sd + 1 , sd + n + 1); ans ++; if(sd[n] <= op) break; else continue; } put(ans); return 0; }
#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <cmath> #include <cstdlib> #include <queue> using namespace std; #define zxy(i , a , b) for(ll i = a ; i <= b ; i ++) #define zxyzxy(i , a , b) for(ll i = a ; i < b ; i ++) #define yxz(i , a , b) for(ll i = a ; i >= b ; i --) #define yxzyxz(i , a , b) for(ll i = a ; i > b ; i --) #define N 500010 typedef long long ll; ll read() { ll ans = 0; char ch = getchar(),last = ‘ ‘; while(ch < ‘0‘ || ch > ‘9‘) last = ch , ch = getchar(); while(ch >= ‘0‘ && ch <= ‘9‘) ans = ans * 10 + ch - ‘0‘ , ch = getchar(); if(last == ‘-‘) ans = -ans; return ans; } void put(ll x) { if(x < 0) { putchar(‘-‘); x = -x; } if(x == 0) { putchar(‘0‘); return; } ll q[100] , nn = 0; while(x) q[++ nn] = x % 10 , x /= 10; while(nn) putchar(‘0‘ + q[nn]), --nn; } ll n,a,b,wet[N],dry,ti = 0; priority_queue <ll> q; int main() { //freopen("dry.in","r",stdin); //freopen("dry.out","w",stdout); n = read(); a = read(); b = read(); zxy(i , 1 , n) { wet[i] = read(); q.push(wet[i]); } // while(!q.empty()) printf("#%d ",q.top()),q.pop();enter; while(1) { int maxn = q.top(); // printf("#%d\n",maxn); q.pop(); if(maxn <= dry) break; maxn -= b; q.push(maxn); dry += a; ti++; } put(ti); return 0; } /* 3 2 2 6 1 5 */
奶牛曬衣服(題解)