bzoj1306: [CQOI2009]match循环赛

来源:互联网 发布:淘宝分销发货 编辑:程序博客网 时间:2024/05/29 15:50

传送门
显然是爆搜+O(玄学)优化。
剪枝1:如果全取3或全取0仍不可行退出。
剪枝2:如果还有n个队没有比过,分数差n*3-1,退出。
然后就过了呀。

#include<cstring>#include<cstdio>#include<iostream>using namespace std;const int f[]={3,1,0,0};int a[9],b[9],n,ans;inline void dfs(int x,int y){    if (b[x]>a[x]) return;    if (b[x]+(n-y+1)*3<a[x]) return;    if (x==n){ans++; return;}    if (y==n){        int t=a[x]-b[x];        if (t==2) return;        b[y]+=f[t];        dfs(x+1,x+2);        b[y]-=f[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 (int i=1;i<=n;i++) scanf("%d",&a[i]);    dfs(1,2);    printf("%d",ans);    return 0;}
0 0