1 条题解

  • 0
    @ 2026-2-9 14:27:42
    #include<bits/stdc++.h>
    using namespace std;
    int fx[4]={3,0,1};
    int fy[4]={0,3,1};
    int n,a[9],p[9],ans;//p[i]表示i号队的当前得分 
    void dfs(int x,int y)//x号队和第y号队比赛 
    {
        if(p[x]>a[x]||p[x]+(n-y+1)*3<a[x])return;//剪枝:超a[x] 或 下来都赢也达不到a[x] 
      
        if(x==n){ans++;return;}
        if(y==n)//和最后一个队伍比赛 
        {
            int t=a[x]-p[x];if(t==2||t>3) return;//2分或者3分以上不可能达成 
            p[x]+=t;p[y]+=(t==1?1:3-t);
            dfs(x+1,x+2);//下一场比赛 
            p[x]-=t;p[y]-=(t==1?1:3-t);
            return ; 
        }
        for(int i=0;i<=2;i++)//for i=0:赢;1:输;2:平 
    	{
    		p[x]+=fx[i];p[y]+=fy[i];
    		dfs(x,y+1);
    		p[x]-=fx[i];p[y]-=fy[i];
        }
    }
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++) scanf("%d",&a[i]);
        ans=0;dfs(1,2);//第一场:1号队和2号队比赛 
        printf("%d\n",ans);
        return 0;
    }
    
    • 1

    信息

    ID
    782
    时间
    3000ms
    内存
    128MiB
    难度
    5
    标签
    递交数
    168
    已通过
    59
    上传者