NOI 2009 植物大戰殭屍

2021-08-28 23:12:54 字數 3394 閱讀 9266

傳送門

題目描述:

plants vs. zombies(pvz)是最近十分風靡的一款小遊戲。plants(植物)和 zombies(殭屍)是遊戲的主角,其中 plants 防守,而 zombies 進攻。該款遊戲包含多種不同的挑戰系列,比如 protect your brain、bowling 等等。其中最為經典的,莫過於玩家通過控制 plants 來防守 zombies 的進攻,或者相反地由玩家通過控制 zombies 對plants 發起進攻。

現在,我們將要考慮的問題是遊戲中 zombies 對 plants 的進攻,請注意,本題中規則與實際遊戲有所不同。遊戲中有兩種角色,plants 和 zombies,每個 plant 有乙個攻擊位置集合,它可以對這些位置進行保護;而 zombie 進攻植物的方式是走到植物所在的位置上並將其吃掉。

遊戲的地圖可以抽象為乙個 n 行 m 列的矩陣,行從上到下用 0 到 n-1 編號,列從左到右用 0 到 m-1 編號;在地圖的每個位置上都放有乙個 plant,為簡單起見,我們把位於第 r 行第 c 列的植物記為 pr,c 。

plants 分很多種,有攻擊類、防守類和經濟類等等。為了簡單的描述每個 plant,定義 score 和 attack 如下:

score[pr,c]:zombie 擊潰植物 pr,c 可獲得的能源。若 score[pr,c] 為非負整數,則表示擊潰植物 pr,c 可獲得能源 score[pr,c],若為負數表示擊潰 pr,c 需要付出能源 -score[pr,c]。

attack[pr,c]:植物 pr,c 能夠對 zombie 進行攻擊的位置集合。

zombies 必須從地圖的右側進入,且只能沿著水平方向進行移動。zombies 攻擊植物的唯一方式就是走到該植物所在的位置並將植物吃掉。因此 zombies 的進攻總是從地圖的右側開始。也就是說,對於第 r 行的進攻,zombies 必須首先攻擊 pr,m-1 ;若需要對 pr,c(0≤c)攻擊,必須將 pr,m-1,pr,m-2 … pr,c+1 先擊潰,並移動到位置 (r,c) 才可進行攻擊。

在本題的設定中,plants 的攻擊力是無窮大的,一旦 zombie 進入某個 plant 的攻擊位置,該 zombie 會被瞬間消滅,而該 zombie 沒有時間進行任何攻擊操作。因此,即便 zombie 進入了乙個 plant 所在的位置,但該位置屬於其他植物的攻擊位置集合,則 zombie 會被瞬間消滅而所在位置的植物則安然無恙(在我們的設定中,plant 的攻擊位置不包含自身所在位置,否則你就不可能擊潰它了)。

zombies 的目標是對 plants 的陣地發起進攻並獲得最大的能源收入。每一次,你可以選擇乙個可進攻的植物進行攻擊。本題的目標為,制定一套 zombies 的進攻方案,選擇進攻哪些植物以及進攻的順序,從而獲得最大的能源收入。

輸入格式:

輸入第一行包含兩個整數 n,m,分別表示地圖的行數和列數。

接下來 n×m 行描述每個位置上植物的資訊。第 r×m+c+1 行按照如下格式給出植物 pr,c 的資訊:

第乙個整數為 score[pr,c],

第二個整數為集合 attack[pr,c] 中的位置個數 w ,

接下來 w 個位置資訊 (r』,c』),表示 pr,c 可以攻擊位置第 r』 行第 c』 列。

輸出格式:

輸出僅包含乙個整數,表示可以獲得的最大能源收入。注意,你也可以選擇不進行任何攻擊,這樣能源收入為 0 。

樣例資料:輸入

3 210 0

20 0

-10 0

-5 1 0 0

100 1 2 1

100 0 輸出

25 備註:

【樣例說明】

在樣例中, 植物 p1,1 可以攻擊位置 (0,0) , p2,0 可以攻擊位置 (2,1)。

乙個方案為,首先進攻 p1,1, p0,1,此時可以攻擊 p0,0 。共得到能源收益為 (-5)+20+10=25。注意, 位置 (2,1) 被植物 p2,0 保護,所以無法攻擊第 2 行中的任何植物。

【資料範圍】

約 20% 的資料滿足 1≤n,m≤5;

約 40% 的資料滿足 1≤n,m≤10;

約 100% 的資料滿足 1≤n≤20,1≤m≤30,-10000≤score≤10000

賊長的題目描述。。。

對於每個植物,都向保護它的植物連邊,表示要吃掉它,必須先吃掉保護它的植物

那麼要連邊的話有以下兩種情況:

乙個植物能攻擊到的所有位置上的植物要向它連邊

一行中左邊的植物要向右邊的植物連邊

連完邊之後,就是乙個典型的最大權閉合子圖模型,網路流求解即可

注意以下的坑點:

雖然點數不多,最多 600 個,但連出來的邊可能有很多,陣列要開大一點

圖中可能會出現環,即幾種植物互相保護,這時肯定一顆植物都吃不掉,我們用拓撲排序排除掉這種情況即可

#include

using

namespace std;

const

int n=

605,m=

1e6+

5,inf=

0x3f3f3f3f

;int n,m,s,t,t=1;

int d[n]

,f[n]

,in[n]

,score[n]

,first[n]

,v[m]

,w[m]

,nxt[m]

;bool flag[n]

;void

add(

int x,

int y,

int z)

void

topsort()

}queue<

int>q;

bool

bfs()}

return d[t]!=-

1;}int

dinic

(int x,

int flow)

}return ans;

}int

main()

if(j!=m)

add(id,id+

1,inf)

,in[id]++;

}}topsort()

,flag[s]

=flag[t]

=true

;int ans=0;

for(

int i=

1;i<=n*m;

++i)

}while

(bfs()

) ans-

=dinic

(s,inf)

;printf

("%d"

,ans)

;return0;

}

NOI2009 植物大戰殭屍

這道題跟noi2006 最大獲利其實是很像的 一樣都是要搞定一些點才能搞定另一些點,然後有些點正權有些點負權 這種問題,其實是最大權閉合子圖 amber的最小割 有詳細的講解法和證明 閉合子圖的定義是,圖中每個點所連線的的任何一條邊不指向圖外,可以有邊指向這個圖 這實際上就是乙個依賴關係,如果我們把...

NOI 2009 植物大戰殭屍

plants vs.zombies pvz 是最近十分風靡的一款小遊戲。plants 植物 和 zombies 殭屍 是遊戲的主角,其中 plants 防守,而 zombies 進攻。該款遊戲包含多種不同的挑戰系列,比如 protect your brain bowling 等等。其中最為經典的,莫...

NOI2009 植物大戰殭屍

這道題跟noi2006 最大獲利其實是很像的 一樣都是要搞定一些點才能搞定另一些點,然後有些點正權有些點負權 這種問題,其實是最大權閉合子圖 amber的最小割 有詳細的講解法和證明 閉合子圖的定義是,圖中每個點所連線的的任何一條邊不指向圖外,可以有邊指向這個圖 這實際上就是乙個依賴關係,如果我們把...