牛客練習賽61 c題 四個選項

2021-10-04 23:16:38 字數 1399 閱讀 2734

題目鏈結

題目描述

眾所周知,高考數學中有乙個題目是給出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...