1. 程式人生 > >奶牛曬衣服(題解)

奶牛曬衣服(題解)

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 --) #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,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
*/

奶牛曬衣服(題解)