羅区P4053 [JSOI2007]建物の修理
説明
- 剛は「建物の修理」コンピュータゲームJSOIプランと呼ばれる劇中:激しい戦いの後、T部族の侵略者は、すべてのzの部族を破壊しました。しかし、T部族のベースは、すでに、その後、できるだけ早く、これらの施設は完全に破壊される建物を修理していない場合、深刻な被害を受けたNビル施設を併設しています。彼は即座にすべての建物に到達することができますが、T部族ベース、唯一の修理工が、建物は毎回いくつかの修理が必要:現在の状況です。同時に、完全な修理修理は、建物の修理建物の隣に、複数の建物を修復することはできません。建物は完全に一定の期間内に完了して修復されていない場合は、建物は廃棄されます。あなたの仕事は、建物の多くを修復するために合理的な剛修理順序を策定を支援することです。
- 最初の行は整数N、次の二つの整数N線T1であり、T2は、建物に記載されている:修復はまだT2秒以内に完了しない場合、この構成は、T1秒の修理が必要、廃棄建物。
出力
4
100 200
200 1300
1000 1250
2000 3200
サンプル出力
3
データサイズ
- N <15万。T1 <T2 <maxlongint
ソリューション:
- 貪欲+バイナリヒープ。
- この質問を書くとき、私は考え、この質問。
- したがって、この問題のために、同じことが建設を取るためには、有効期限に応じて並べ替えることができます。
- あなたがいない場合には、修理を修復するために与えることができれば、最も時間のかかるプロジェクトが現在のプロジェクトよりも大きい場合には、経過時間によって置き換えよりも大きくして、更新された場合、ヒープのトップを見てみましょう。問題について以下。
- それはではないことが判明したが、私は非常に論理的な交通考える必要があります。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#define N 150005
using namespace std;
struct A {int val, end;} a[N];
int n, sum, ans;
priority_queue<int> que;
int read()
{
int x = 0; char c = getchar();
while(c < '0' || c > '9') c = getchar();
while(c >= '0' && c <= '9') {x = x * 10 + c - '0'; c = getchar();}
return x;
}
bool cmp(A x, A y) {return x.end < y.end;}
int main()
{
cin >> n;
for(int i = 1; i <= n; i++)
a[i].val = read(), a[i].end = read();
sort(a + 1, a + 1 + n, cmp);
for(int i = 1; i <= n; i++)
if(sum + a[i].val <= a[i].end)
ans++, sum += a[i].val, que.push(a[i].val);
else if(que.top() > a[i].val)
{
sum -= (que.top() - a[i].val);
que.pop();
que.push(a[i].val);
}
cout << ans;
return 0;
}