題目鏈結
題目描述
眾所周知,高考數學中有乙個題目是給出12個單項選擇,每乙個選擇的答案是 a,b,c,d 中的乙個。
網上盛傳答案存在某種規律,使得矇對的可能性大大增加。於是今年老師想讓你安排這12個題的答案。但是他有一些條件,首先四個選項的數量必須分別為 na,nb,nc,nd。其次有 m 個額外條件,分別給出兩個數字 x,y,代表第 x 個題和第 y 個題的答案相同。 現在你的老師想知道,有多少種可行的方案安排答案。
輸入描述:
第一行五個非負整數na,nb,nc,nd,m,保證na+nb+nc+nd=12,0≤m≤1000。
接下來m行每行兩個整數x,y(1≤ x,y ≤12)代表第x個題和第y個題答案必須一樣。
輸出描述:
僅一行乙個整數,代表可行的方案數。
題解:
我們按如圖所示,把答案相同的放在乙個樹上,把題目個數往根節點轉移。那麼到時我們只需要考慮每個樹的根節點即可,大大減小了時間複雜度。過程**中分析;
#include
#include
#include
#include
using
namespace std;
typedef
long
long ll;
const
int n=20;
int tree[n]
;int a[5]
;int head[n]
;int cnt;
intgethead
(int x)
ll ans=0;
void
bfs(
int x)
for(
int i=
1;i<=
4;i++)if
(a[i]
>=tree[x]
)//遍歷找情況
}int
main()
for(
int i=
1;i<=
12;i++)if
(gethead
(i)==i)cnt++
;else tree[head[i]]++
;sort
(tree+
1,tree+
14,greater<
int>()
);//從大到小,把根節點換到前面
sort
(a+1
,a+1+4
,greater<
int>()
);//根節點從大到小,a也要從大到小
bfs(1)
; cout<
}
牛客練習賽61 C 四個選項
題目 稍微想下就應該知道,樣例是最大的方案數,40萬 並不是很大,可以dfs 蒐一波。對於答案相同的題目,其實無非就是 關係,我們可以用陣列now i 將其 比如 1,3,8是同一答案,可以用並查集的思想,然後讓其中乙個 例如 now 1 3,now 3 0,now 8 0,這樣就能實現搜的時候實現...
牛客練習賽61 a 打怪
題目鏈結 題目描述 你是乙個勇士,現在你準備去森林刷毛球怪,你有兩個屬性 血量,攻擊力 毛球怪也有這兩個屬性。當你遭遇乙隻毛球怪時你們會進入戰鬥,然後你和毛球怪輪流攻擊 你先手 每次使對方的血量減去自己攻擊力的數值,當一方的血量小於等於 0 時死亡。現在你想知道在自己活著的前提下最多殺死幾隻毛球怪。...
牛客練習賽61 A 打怪
你是乙個勇士,現在你準備去森林刷毛球怪,你有兩個屬性 血量,攻擊力 毛球怪也有這兩個屬性。當你遭遇乙隻毛球怪時你們會進入戰鬥,然後你和毛球怪輪流攻擊 你先手 每次使對方的血量減去自己攻擊力的數值,當一方的血量小於等於 0 時死亡。現在你想知道在自己活著的前提下最多殺死幾隻毛球怪。第一行乙個正整數 t...