P4053 [JSOI2007]建築搶修
阿新 • • 發佈:2020-08-02
貪心
按照時間從前往後儘可能的修
如果能修就修,修不了的話
我們可以選擇撤掉一個以前修的騰出時間來,但是,騰出兩個顯然更蠢
那麼,顯然無論騰不騰,截止到此建築,能修的數量最多一定()
由此觀之,應該把已修的最大的取出來,然後進行比較,放進小的,扔掉大的,來為後面騰時間
#include<iostream> #include<cstdio> #include<algorithm> #include<queue> using namespace std; priority_queue <long long >q ; long long n; struct bu{ long long ne; long long boom; }buil[150001]; bool cmp(bu x,bu y){ if(x.boom==y.boom) return x.ne<y.ne; return x.boom<y.boom; } long long now; long long s; int main(){ scanf("%lld",&n); for(long long i=1;i<=n;++i){ scanf("%lld%lld",&buil[i].ne,&buil[i].boom); } sort(buil+1,buil+n+1,cmp); for(long long i=1;i<=n;++i){ if(buil[i].ne+now<=buil[i].boom){ q.push(buil[i].ne); now+=buil[i].ne; s++; continue; }else{ if(!q.empty()){ if(q.top()>buil[i].ne){ now=now+buil[i].ne-q.top(); q.pop(); q.push(buil[i].ne); }else{ continue; } } } } cout<<s; return 0; }