題目描述
現在電視台有一種節目叫做超級英雄,大概的流程就是每位選手到台上回答主持人的幾個問題,然後根據回答問題的多少獲得不同數目的獎品或獎金。主持人問題準備了若干道題目,只有當選手正確回答一道題後,才能進入下一題,否則就被淘汰。為了增加節目的趣味性並適當降低難度,主持人總提供給選手幾個「錦囊妙計」,比如求助現場觀眾,或者去掉若干個錯誤答案(選擇題)等等。
這裡,我們把規則稍微改變一下。假設主持人總共有m道題,選手有n種不同的「錦囊妙計」。主持人規定,每道題都可以從兩種「錦囊妙計」中選擇一種,而每種「錦囊妙計」只能用一次。我們又假設一道題使用了它允許的錦囊妙計後,就一定能正確回答,順利進入下一題。現在我來到了節目現場,可是我實在是太笨了,以至於一道題也不會做,每道題只好借助使用「錦囊妙計」來通過。如果我事先就知道了每道題能夠使用哪兩種「錦囊妙計」,那麼你能告訴我怎樣選擇才能通過最多的題數嗎?
輸入格式
輸入的第一行是兩個正整數 n 和 m (0 < n < 1001, 0 < m < 1001)表示總共有 n 種「錦囊妙計」,編號為 0∼n
−1
0 \sim n-1
0∼n−
1 ,總共有 m 個問題。
以下的m行,每行兩個數,分別表示第 m 個問題可以使用的「錦囊妙計」的編號。
注意,每種編號的「錦囊妙計」只能使用一次,同乙個問題的兩個「錦囊妙計」可能一樣。
輸出格式
輸出的第一行為最多能通過的題數 p,接下來 p 行,每行為乙個整數,第 i 行表示第 i 題使用的「錦囊妙計的編號」。
如果有多種答案,那麼任意輸出一種,本題使用 special judge 評判答案。
輸入輸出樣例
輸入
563
2200
3043
232
輸出
432
04
思路:
這一題和最大匹配的模板差不多,但是有乙個小坑。
所以當我們跑最大匹配沒有匹配時,就要break。
#include
#include
#include
using
namespace std;
const
int n=
2e3+10;
struct node
edge[n]
;int n, m, a, b, hd[n]
, tot, ans, link[n]
, ans1[n]
;bool cover[n]
;void
add(
int u,
int v)
,hd[u]
=tot;
}bool
find
(int x)
}return0;
}int
main()
for(
int i=
1; i<=m; i++
)printf
("%d\n"
, ans)
;for
(int i=
1; i<=ans; i++
)printf
("%d\n"
, ans1[i]);
//為什麼可以是1~ans,因為答題是按順序的(1~ans)
return0;
}
P2319 HNOI2006 超級英雄 題解
現在電視台有一種節目叫做超級英雄,大概的流程就是每位選手到台上回答主持人的幾個問題,然後根據回答問題的多少獲得不同數目的獎品或獎金。主持人問題準備了若干道題目,只有當選手正確回答一道題後,才能進入下一題,否則就被淘汰。為了增加節目的趣味性並適當降低難度,主持人總提供給選手幾個 錦囊妙計 比如求助現場...
洛谷 P2319 HNOI2006 超級英雄
現在電視台有一種節目叫做超級英雄,大概的流程就是每位選手到台上回答主持人的幾個問題,然後根據回答問題的多少獲得不同數目的獎品或獎金。主持人問題準備了若干道題目,只有當選手正確回答一道題後,才能進入下一題,否則就被淘汰。為了增加節目的趣味性並適當降低難度,主持人總提供給選手幾個 錦囊妙計 比如求助現場...
1191 HNOI2006 超級英雄Hero
description 現在電視台有一種節目叫做超級英雄,大概的流程就是每位選手到台上回答主持人的幾個問題,然後根據回答問題的多少獲得不同數目的獎品或獎金。主持人問題準備了若干道題目,只有當選手正確回答一道題後,才能進入下一題,否則就被淘汰。為了增加節目的趣味性並適當降低難度,主持人總提供給選手幾個...