題目描述
小豆報名參加智力競賽,他帶上了 n個好朋友作為親友團一塊來參加比賽。
比賽規則如下:一共有 m道題目,每個人都有 1 次答題機會,每次答題為選擇一道題目回答,在回答正確後,可以從這個題目的後續題目,直到題目答錯題目或者沒有後續題目。
每個問題都會代表乙個價值,比賽最後的參賽選手獲得獎勵價值等價於該選手和他的親友團沒有回答的問題中的最低價值。
我們現在知道小豆和他的親友團實力非常強,能夠做出這次競賽中的所有題目。
小豆想知道在知道題目和後續題目的條件下,他最大能獲得價值是多少?
輸入格式
第一行有兩個整數 n, m
接下來 m行,第 i+1 行表示編號為 i的題目的題目資訊;
格式如下 vi,ki,ai,1,ai,2,…,ai,ki
其中 vi表示該題目的價值, ki 表示這個題目的後續, ai,1,ai,2,…,ai,ki 表示這 i個題目的後續題目編號。
輸出格式
如果全部題目都能答對,則輸出 ak ,否則輸出小豆可以獲得的最高獎勵價值。
樣例樣例輸入 1
1 3
1 02 1 3
3 0ak
樣例輸入 2
1 6
1 2 2 3
2 1 4
3 1 4
4 1 6
5 06 0
5
資料範圍與提示
對於 10%的資料, 1≤n,m≤10 。
對於 20% 的資料, 1≤n,m≤100 。
對於 100% 的資料, 1≤n≤50,1≤m≤500,vi≤109,ki,ai,j≤m
說實話沒讀懂題面
一句話題意:給出乙個帶權有向圖,選出n+1
n+1n+
1條鏈能否全部點覆蓋,如果不能,不能覆蓋的點權最小值最大是多少
最小值最大,套路又整二分上
考慮二分不能覆蓋的最小值
就轉化為了dag
dagda
g的最小不相交路徑覆蓋條數
也就可以轉化為二分圖最大匹配,最大匹配數就是可合併的路徑條數
點數➖最大匹配數=最小不相交路徑覆蓋數
如果二分結果大於最大值,就說明每道題都能被覆蓋到,就akak
ak了
#
include
#include
#include
using
namespace std;
#define
maxn
505vector <
int> g[maxn]
;int n, m;
int val[maxn]
, match[maxn]
;int g[maxn]
[maxn]
, f[maxn]
[maxn]
;bool vis[maxn]
;bool
find
(int u )
}return0;
}bool
check
(int x )
for(
int i =
1;i <= m;i ++
)return tot <= n;
}int
main()
for(
int k =
1;k <= m;k ++
)for
(int i =
1;i <= m;i ++)if
( g[i]
[k])
//不加此優化 時間複雜度就會跑滿m^3log
for(
int j =
1;j <= m;j ++
) g[i]
[j]|= g[i]
[k]& g[k]
[j];
int maxx = r;
while
( l <= r )
if( l > maxx )
printf
("ak\n");
else
printf
("%d\n"
, l )
;return0;
}
TJOI2018 智力競賽
題意 小豆報名參加智力競賽,他帶上了n個好朋友作為親友團一塊來參加比賽。比賽規則如下 一共有m道題目,每個人都有 1 次答題機會,每次答題為選擇一道題目回答,在回答正確後,可以從這個題目的後續題目,直到題目答錯題目或者沒有後續題目。每個問題都會代表乙個價值,比賽最後的參賽選手獲得獎勵價值等價於該選手...
TJOI2018 智力競賽
題解好難看啊。就是求可重路徑覆蓋之後最大化剩餘點的最小權值 二分答案後就是乙個可重複路徑覆蓋 處理出可達點做二分圖匹配就好了 include include include define gc getchar define pc putchar inline int read void print ...
TJOI2018 d1t2 智力競賽
題意不太明確.這題的n需要一上來就 1。就是求乙個可交最小路徑覆蓋,二分答案即可。不知道為什麼我的常數那麼大,別人幾乎300ms就完事了,我需要800ms。include include include using namespace std inline char gc return s inli...