足球比赛

题目描述

M中学一年一度的足球比赛开始啦,林老师作为一个热心观众,在得到消息后急急忙忙的赶到了M中学,可惜的是,当林老师赶到M中学时,所有的比赛都已经结束啦。最后林老师只得到了所有队伍的总积分表,林老师想知道,今年M中学的足球比赛一共有多少种可能的比赛情况(所有的足球队两两之间都会进行一场比赛,胜者得3分,败者得0分,打平得1分,任何两个球队之间有胜负关系不同的情况视为两种比赛情况)。

输入格式

第一行输入一个数字n(2≤n≤8)——表示M中学参加比赛的球队数量 接下来一行输入n个数字,表示每支球队得到的积分总数。题目保证至少存在一种可能的比赛情况。

输出格式

输出一个数字,表示可能的比赛情况数量。

样例

样例输入1

3
3 3 3

样例输出1

2

样例输入2

6
5 6 7 7 8 8

样例输出2

121

c++AC题解

#include<cstdio>
using namespace std;
int n,a[100005],sc[100005],ans;
inline void dfs(int u,int v){
	if(u==n){
		if(sc[u]==a[u])ans++;
		return;
	}
	if(v==n+1){
		if(sc[u]==a[u])dfs(u+1,u+2);
		return;
	}
	sc[u]+=3;
	if(sc[u]>a[u]||(n-u)*3+sc[u]<a[u]);
	else dfs(u,v+1);
	sc[u]-=3;
	sc[v]+=3;
	if(sc[v]>a[v]||(n-u-1)*3+sc[v]<a[v]);
	else dfs(u,v+1);
	sc[v]-=3;
	sc[u]++,sc[v]++;
	if(sc[u]>a[u]||sc[v]>a[v]||(n-v)*3+sc[u]<a[u]||(n-u-1)*3+sc[v]<a[v]);
	else dfs(u,v+1);
	sc[u]--,sc[v]--;
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);	
	dfs(1,2);
	printf("%d",ans);
	return 0;
}
 
posted @ 2021-03-06 09:46  黄逸飞重庆八中  阅读(347)  评论(0编辑  收藏  举报