您的位置:首页 > 其它

bzoj 1306 match循环赛

2018-02-09 19:38 351 查看
Description

Input

第一行包含一个正整数n,队伍的个数。第二行包含n个非负整数,即每支队伍的得分。

Output

输出仅一行,即可能的分数表数目。保证至少存在一个可能的分数表。

Sample Input

6

5 6 7 7 8 8

Sample Output

121

HINT

N<=8

搜索,剪枝

时间压的真紧……

10028 ms也算过了

#include <iostream>
#include <cstdio>
#define For(i,l,r) for(int i=l;i<=r;++i)
using namespace std;
int n,a[9],b[9],ans,sco[]={3,1,0,0};
void dfs(int x,int y)
{
if(b[x]>a[x])
return;
if((b[x]+3*(n-y+1))<a[x])
return;
if(x==n)
{
ans++;
return;
}
if(y==n)
{
int t=a[x]-b[x];
if(t==2)
return;
b[y]+=sco[t];
dfs(x+1,x+2);
b[y]-=sco[t];
}
else
{
b[x]+=3;dfs(x,y+1);b[x]-=3;
b[y]+=3;dfs(x,y+1);b[y]-=3;
b[x]++;b[y]++;dfs(x,y+1);b[x]--;b[y]--;
}
}
int main()
{
scanf("%d",&n);
For(i,1,n)
scanf("%d",&a[i]);
dfs(1,2);
printf("%d",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: