SCOI2010 連續攻擊遊戲

2022-02-04 19:10:49 字數 1348 閱讀 2053

題目

description

lxhgww最近迷上了一款遊戲,在遊戲裡,他擁有很多的裝備,每種裝備都有2個屬性,這些屬性的值用[1,10000]之間的數表示。當他使用某種裝備時,他只能使用該裝備的某乙個屬性。並且每種裝備最多只能使用一次。遊戲進行到最後,lxhgww遇到了終極boss,這個終極boss很奇怪,攻擊他的裝備所使用的屬性值必須從1開始連續遞增地攻擊,才能對boss產生傷害。也就是說一開始的時候,lxhgww只能使用某個屬性值為1的裝備攻擊boss,然後只能使用某個屬性值為2的裝備攻擊boss,然後只能使用某個屬性值為3的裝備攻擊boss……以此類推。現在lxhgww想知道他最多能連續攻擊boss多少次?

input

輸入的第一行是乙個整數n,表示lxhgww擁有n種裝備接下來n行,是對這n種裝備的描述,每行2個數字,表示第i種裝備的2個屬性值

output

輸出一行,包括1個數字,表示lxhgww最多能連續攻擊的次數。

range

對於30%的資料,保證n < =1000

對於100%的資料,保證n < =1000000

solution

二分圖的最大匹配問題,做法很巧妙,但是很難想到。

第一眼看到這個題想到的是將某個物品的兩個屬性分成左右部點,但是很難解決本題,尤其是在處理乙個物品只能用一種屬性的時候。所以我們不妨換一種思路,對於物品 i 的屬性a,b,分別從a和b向i連一條有向邊。將物品的屬性當做左部點,編號當做右部點,求最大匹配即可。

這樣為什麼是正確的呢?我們可以考慮匈牙利演算法的具體過程:在匹配值為 i 的技能時,那麼 1~i-1 的屬性肯定已經匹配完成,所以如果 i 對應的編號 j 被匹配了的話,那麼就讓匹配 j 的那個屬性 p 再去找別的物品標號匹配,形象地說,就是用別的物品來釋放攻擊力為 p 的這個技能,用 j 這個物品釋放攻擊力為 i 的技能。如果找到這樣一條增廣路,那麼就說明當前可以匹配,ans++。

code

#include#include

using

namespace

std;

intn,cnt,ans;

bool vis[10005

];int head[10005

];int pre[1000005

];struct

edgeedge[

2000005

];void add(int x,int

y)bool dfs(int

now)

}return0;

}signed main()

for(int i=1;i<=10000;i++)

printf("%d

",ans);

return0;

}

SCOI2010 連續攻擊遊戲

原題鏈結 抱歉有點事要忙只能引用了 這道題正解是用二分圖,但是做完這道題的第二題才講 所以我採用的我當時會的做法 並查集。我們每有乙個 a,b 時我們可以把它當做一條邊 a,b 然後對於構圖之後,乙個大小為k聯通塊,我們發現有如下性質 如果這個聯通塊沒有環 樹 因為有k 1條邊,那麼總有方法使其中的...

SCOI2010 連續攻擊遊戲

這道題是乙個二分圖匹配問題。如果第 i 件裝備的屬性值為 j 將裝備 i 連邊到屬性值 j 注意裝備結點 屬性值結點 然後從 1 到 10000 跑二分圖匹配,判斷該點是否能被匹配。直到不能匹配為止。1 include 2 3using namespace std 45 define re regi...

SCOI2010 連續攻擊遊戲

lxhgww最近迷上了一款遊戲,在遊戲裡,他擁有很多的裝備,每種裝備都有2個屬性,這些屬性的值用 1,10000 之間的數表示。當他使用某種裝備時,他只能使用該裝備的某乙個屬性。並且每種裝備最多只能使用一次。遊戲進行到最後,lxhgww遇到了終極boss,這個終極boss很奇怪,攻擊他的裝備所使用的...