BZOJ1029建築搶修

1029: [JSOI2007]建築搶修
Time Limit: 4 Sec Memory Limit: 162 MB
Submit: 3333 Solved: 1501
Description
小剛在玩JSOI提供的一個稱之爲“建築搶修”的電腦遊戲:經過了一場激烈的戰鬥,T部落消滅了所有z部落的入侵者。但是T部落的基地裏已經有N個建築設施受到了嚴重的損傷,如果不盡快修復的話,這些建築設施將會完全毀壞。現在的情況是:T部落基地裏只有一個修理工人,雖然他能瞬間到達任何一個建築,但是修復每個建築都需要一定的時間。同時,修理工人修理完一個建築才能修理下一個建築,不能同時修理多個建築。如果某個建築在一段時間之內沒有完全修理完畢,這個建築就報廢了。你的任務是幫小剛合理的制訂一個修理順序,以搶修儘可能多的建築。
Input
第一行是一個整數N,接下來N行每行兩個整數T1,T2描述一個建築:修理這個建築需要T1秒,如果在T2秒之內還沒有修理完成,這個建築就報廢了。
Output
輸出一個整數S,表示最多可以搶修S個建築.N < 150,000; T1 < T2 < maxlongint
Sample Input
4
100 200
200 1300
1000 1250
2000 3200
Sample Output
3
堆+貪心。。
其實很好想。。不知道當時爲什麼沒有A。。
這個坑由現在來填。。
STL大法好。。
附上本蒟蒻的代碼:

#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
int n,i,ans=0,now;
priority_queue<int,vector<int>,less<int> >q;
struct kx
{
    int a,b;
}f[150001];

int read()
{
    int w=0,c=1; char ch=getchar();
    while (ch<'0' || ch>'9')
      {
        if (ch=='-') c=-1;
        ch=getchar();
      }
    while (ch>='0' && ch<='9')
      w=w*10+ch-'0',ch=getchar();
    return w*c;
}

bool cmp(const kx x,const kx y)
{
    return x.b<y.b;
}

int main()
{
    n=read();
    for (i=1;i<=n;i++) f[i].a=read(),f[i].b=read();
    sort(f+1,f+n+1,cmp);
    for (i=1;i<=n;i++)
      if (now+f[i].a<=f[i].b)
        {
            ans++;
            now+=f[i].a;
            q.push(f[i].a);
        }
      else
        {
            int tmp=q.top();
            if (f[i].a<tmp)
              {
                q.pop();
                q.push(f[i].a);
                now=now-tmp+f[i].a;
              }
        }
    printf("%d",ans);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章