检测到 KaTeX 加载失败,可能会导致文中的数学公式无法正常渲染。
#题面
#题目描述
支队伍比赛,每两支队伍比赛一次,平 胜 负 。
给出队伍的最终得分,求有多少种可能的分数表。
提示
平 胜 负 :
- 若两支队伍打平,则各得到 分;
- 否则,胜利的队伍得到 分,被打败的队伍得到 分。
#输入格式
第一行包含一个正整数 ,表示队伍的个数。第二行包含 个非负整数,即每支队伍的得分。
#输出格式
输出仅一行,即可能的分数表数目。保证至少存在一个可能的分数表。
#输入输出样例
样例输入 #1
6
5 6 7 7 8 8
样例输出 #1
121
#数据范围与提示
对于 的数据,。
#思路
搜索卡常题,有几个剪枝:
-
如果当前得分已经大于最终得分,则答案一定不合法。
C++ 12
13
14
15
16
17void dfs(int x, int y) {
// 当前得分已经大于最终得分
if (s[x] > a[x]) return;
// 如果以后的比赛全赢也小于最终得分
if (s[x] + (n - y + 1) * 3 < a[x]) return; -
如果以后的比赛全赢也不能达到最终得分,则答案一定不合法。
C++ 14
15
16
17
18
19if (s[x] > a[x]) return;
// 如果以后的比赛全赢也小于最终得分
if (s[x] + (n - y + 1) * 3 < a[x]) return;
if (x == n && s[x] == a[x]) { -
最后一场比赛时如果与目标分数的差值为 ,显然无法凑齐,答案不合法。
96 分代码C++ 25
26
27
28
29
30
31if (y == n) {
int t = a[x] - s[x];
// 最后一场比赛无法凑出 2 分
if (t == 2) return;
t = t == 0 ? 3 : t == 1;
#代码
1 |
|