NOI 2009 植物大戰殭屍

2021-06-04 18:13:00 字數 3213 閱讀 7701

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(r, c)才可進行攻擊。

在本題的設定中,plants

的攻擊力是無窮大的,一旦

zombie

進入某個

plant

的攻擊位置,該

zombie

會被瞬間消滅,而該zombie

沒有時間進行任何攻擊操作。因此,即便zombie

進入了乙個

plant

所在的位置,但該位置屬於其他植物的攻擊位置集合,則

zombie

會被瞬間消滅而所在位置的植物則安然無恙(在我們的設定中,

plant

的攻擊位置不包含自身所在位置,否則你就不可能擊潰它了)。

zombies的目標是對

plants

的陣地發起進攻並獲得最大的能源收入。每一次,你可以選擇乙個可進攻的植物進行攻擊。本題的目標為,制定一套

zombies

的進攻方案,選擇進攻哪些植物以及進攻的順序,從而獲得最大的能源收入。

輸入檔案pvz.in

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

接下來n×m行描述每個位置上植物的資訊。第r×m + c + 1行按照如下格式給出植物pr, c的資訊:第乙個整數為score[pr, c], 第二個整數為集合attack[pr, c]中的位置個數w,接下來w個位置資訊(r』, c』),表示pr, c可以攻擊位置第r』 行第c』 列。

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

。3 2

10 0

20 0

-10 0

-5 1 0 0

100 1 2 1

100 0

在樣例中, 

植物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

裸的最大權閉合圖。

需要注意的是如果有環就肯定打不了,先拓撲排除掉那些點然後最大流

#include#include#include#include#define inf 100000000

#define min(a,b) ((a)>(b))?(b):(a)

using namespace std;

int map[25][35],head[800],in[800];

bool yes[800];

int n,k,cnt,dist[800],gap[800],edgehead[800];//雙向邊

struct pointedge[1000000];

struct edgeee[1000000];

void addedge(int u,int v,int ca)

void addedge(int u,int v)

int dfs (int p , int limit)}}

int tmp=n+1;

for(int i=edgehead[p];i!=0;i=edge[i].next)

if(--gap[dist[p]]==0 || dist[0]>n)return -1;//出現斷層或回流已滿

++gap[dist[p]=tmp];

return 0;

}int sap()

void top()

else if(map[i][j]<0)

addedge((i-1)*e+j,n,-map[i][j]);

for(p=head[(i-1)*e+j];p;p=ee[p].next)

}} printf("%d\n",sum-sap());

}

NOI2009 植物大戰殭屍

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

NOI2009 植物大戰殭屍

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

NOI 2009 植物大戰殭屍

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