迴圈賽
總時間限制: 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的方法填充,實...