BZOJ 1029 JSOI2007 建築搶修

2021-09-28 09:58:57 字數 1494 閱讀 9884

【題目鏈結】:

【題意】

【題解】

/*

按照t2公升序排

順序列舉每乙個建築;

如果當前建築能夠修理;

則修理它;

並將它的t1值加入到堆中;

然後累加當前所用的時間now;

如果加了這個t1之後會大於t2則這個建築沒辦法修理;

則在堆裡面去找

看看有沒有比t1大的值;

如果有的話,就改修這個建築;而那個建築不修了;

這樣雖然不能增加修理的建築的個數;

但是now的值會減小;

增加了後面能夠新修理建築的機會.

因為now是肯定小於等於t2的,

所以更換以後,相當於是在確定的時間範圍裡面

有兩個建築都能修好;

但不能同時修好;

則當然先修那個修的時間短的了。

開long long安全點。

用stl的priority_queue很方便。

*/

【完整**】

#include 

using

namespace

std;

#define lson l,m,rt<<1

#define rson m+1,r,rt<<1|1

#define ll long long

#define rep1(i,a,b) for (int i = a;i <= b;i++)

#define rep2(i,a,b) for (int i = a;i >= b;i--)

#define mp make_pair

#define pb push_back

#define fi first

#define se second

#define rei(x) scanf("%d",&x)

#define rel(x) scanf("%lld",&x)

#define ref(x) scanf("%lf",&x)

typedef pair pii;

typedef pairpll;

const

int dx[9] = ;

const

int dy[9] = ;

const

double pi = acos(-1.0);

const

int n = 15e4+100;

struct node

};struct abc

;priority_queueq;

node tq;

abc a[n];

int n,ans;

ll now;

void in()

}bool cmp(abc a, abc b)

void ga()

else}}

}void out()

int main()

bzoj1029 JSOI2007 建築搶修

傳送門 貪心顯然。1.按照最後時限排序,暴力插入。但是顯然會錯。10 10 10 20 2 21 2 21 2 21 答案是2,但是顯然最優的是4 於是考慮改進。2.在無法修理時我們可以放棄花費時間最長的工作。明顯花費時間最長的工作時間大於當前工作是修改更優。我們可以用乙個大根堆實現。然後就通過了。...

bzoj1029 JSOI2007 建築搶修

time limit 4 sec memory limit 162 mb submit 4807 solved 2157 submit status discuss 小剛在玩jsoi提供的乙個稱之為 建築搶修 的電腦遊戲 經過了一場激烈的戰鬥,t部落消滅了所有z部落的 入侵者。但是t部落的基地裡已經...

bzoj1029 JSOI2007 建築搶修

description 小剛在玩jsoi提供的乙個稱之為 建築搶修 的電腦遊戲 經過了一場激烈的戰鬥,t部落消滅了所有z部落的 入侵者。但是t部落的基地裡已經有n個建築設施受到了嚴重的損傷,如果不盡快修復的話,這些建築設施將會完全 毀壞。現在的情況是 t部落基地裡只有乙個修理工人,雖然他能瞬間到達任...