題意
小豆報名參加智力競賽,他帶上了n個好朋友作為親友團一塊來參加比賽。
比賽規則如下:一共有m道題目,每個人都有 1 次答題機會,每次答題為選擇一道題目回答,在回答正確後,可以從這個題目的後續題目,直到題目答錯題目或者沒有後續題目。
每個問題都會代表乙個價值,比賽最後的參賽選手獲得獎勵價值等價於該選手和他的親友團沒有回答的問題中的最低價值。
我們現在知道小豆和他的親友團實力非常強,能夠做出這次競賽中的所有題目。
小豆想知道在知道題目和後續題目的條件下,他最大能獲得價值是多少?
solution
首先明確題意:乙個m個點的無向有環圖,給n+1條鏈,問你這些鏈覆蓋的點以外的點的最小值的最大值
一看就是二分,可以用floyd傳遞閉包判斷連不連通
二分權值val,把權值小於val的點全部加入進乙個臨時的圖中,初始化總鏈數為這些點的總數
然後從每個點的後繼中,選擇乙個還沒有被連線過的點,連線上去,總需要的鏈數就-1,因為這個點可以由這個鏈訪問到,不需要額外的訪問了
最後判斷一下總鏈數是否小於等於n+1即可
注意這裡的連線不是真的連線而只是標記一下可不可以從另乙個點訪問過來
code:
#includeusing namespace std;
struct qwqedge[200010];
int head[200010];
int cnt=-1;
void add(int u,int v)
bool vis[510];
int pre[510];
bool find(int u)
if(find(pre[v]))
}return false;
}int v[510];
bool mp[510][510];
bool now[510][510];
int n,m;
bool check(int val)}}
for(int i=1;i<=n;++i)
return tmp<=m;
}int main()
}for(int k=1;k<=n;++k)}}
int l=1,r=top+1;
while(lelse
}if(l==top+1)puts("ak");
else printf("%d\n",l);
}
TJOI2018 智力競賽
題解好難看啊。就是求可重路徑覆蓋之後最大化剩餘點的最小權值 二分答案後就是乙個可重複路徑覆蓋 處理出可達點做二分圖匹配就好了 include include include define gc getchar define pc putchar inline int read void print ...
TJOI2018 智力競賽 (匈牙利)
題目描述 小豆報名參加智力競賽,他帶上了 n個好朋友作為親友團一塊來參加比賽。比賽規則如下 一共有 m道題目,每個人都有 1 次答題機會,每次答題為選擇一道題目回答,在回答正確後,可以從這個題目的後續題目,直到題目答錯題目或者沒有後續題目。每個問題都會代表乙個價值,比賽最後的參賽選手獲得獎勵價值等價...
TJOI2018 d1t2 智力競賽
題意不太明確.這題的n需要一上來就 1。就是求乙個可交最小路徑覆蓋,二分答案即可。不知道為什麼我的常數那麼大,別人幾乎300ms就完事了,我需要800ms。include include include using namespace std inline char gc return s inli...