搜尋 迴圈賽

2021-08-02 07:28:20 字數 2182 閱讀 4056

迴圈賽

總時間限制: 20000ms 單個測試點時間限制: 1000ms 記憶體限制: 65536kb

描述 n支隊伍打比賽,每兩支隊伍恰好比賽一場。平局時各得1分,而有勝負時勝者3分,負者0分。

假設三支隊伍得分分別為3, 3, 3,則可能有兩種情況:

隊伍a b c 得分

a - 3 0 3

b 0 - 3 3

c 3 0 - 3

隊伍a b c 得分

a - 0 3 3

b 3 - 0 3

c 0 3 - 3

給出n支隊伍的最終得分(即所有比賽均已結束),統計有多少種可能的分數表。

輸入 第一行包含乙個正整數n,隊伍的個數。第二行包含n個非負整數,即每支隊伍的得分。

輸出 輸出僅一行,即可能的分數表數目。保證至少存在乙個可能的分數表。

樣例輸入

樣例輸入1:

3 3 3 3

樣例輸入2:

2 0 3

樣例輸入3:

3 4 1 2

樣例輸入4:

6 5 6 7 7 8 8

樣例輸出

樣例輸出1:

2 樣例輸出2:

1 樣例輸出3:

1 樣例輸出4:

121資料規模

測試點 1 2~3 4~6 7~12 13~19 20~25

n 3 4 5 6 7 8

** cqoi

據說這就是hash剪枝,暫時不懂。

參考**

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

std::cin;

using

std::cout;

using

std::endl;

const

int maxn=10;

int n;

int score[maxn];

int ans;

inline

int readin()

long

long hash(std::vector

&vec) //算出陣列對應的hash值

return temp;

}int searchguest(int host, int guest, int scoreofhost);

std::map

long, int> hashmap[maxn];

int searchhost(int host = 1) //搜尋主場

std::vector

hashorigin;

for(int i=host; i<=n; i++)

std::sort(hashorigin.begin(),hashorigin.end());

long

long hashval=hash(hashorigin);

if(hashmap[host].count(hashval)) return hashmap[host][hashval];

else

return hashmap[host][hashval]=searchguest(host, host+1, score[host]);

}int searchguest(int host, int guest, int scoreofhost)

if(scoreofhost > (n-guest+1)*3) return

0; int ans=0;

if(score[guest]>=3)

if(score[guest] && scoreofhost)

if(scoreofhost>=3)

return ans;

}int main()

std::sort(score+1,score+1+n);

printf("%d",searchhost());

return

0;}

BZOJ 1306 match迴圈賽(搜尋)

題意 思路 列舉每個人與其後面所有人的比賽的輸贏。若這個人的得分還沒夠,則返回。然後,接著列舉下乙個人與其後面的所有人比賽的輸贏。由於dfs的每層對應的是同乙個人,我們記錄下剩餘人的得分狀態,若已經搜過,則直接返回。這裡採用最小表示,即將剩餘人的得分排個序,計算乙個雜湊值。include inclu...

演算法設計 迴圈賽

sun 書 計算機演算法設計與分析 q 設有n 2 k個運動員要進行網球迴圈賽。現要設計乙個滿足以下要求的比賽日程表 1 每個選手必須與其他n 1個選手各賽一次 2 每個選手一天只能參賽一次 3 迴圈賽在n 1天內結束。按此要求將比賽日程表設計成有n行和n 1列的乙個表。在表中的第i行,第j列處填入...

迴圈賽日程表

對於書上那個日程表的實現,第三版的課本給出了迴圈實現的方法,不過這個表的生成明顯要用遞迴方法生成更為合適,此表如下 可以看到每次該錶的生成總可以分成四個字表的填充過程,初始化讓左邊第一列填充上之後,然後每一次先遞迴填充左上角的子表,然後再填充左下角的子表,然後右上和右下的子表用copy的方法填充,實...