题解:P12795 [NERC 2022] Football

· · 题解

题意

球队参加了 n 场比赛,已知总进球数 a,总失球数 b,求最少平局次数和具体方案。

思路

一道构造题,分类讨论:

  1. 1. $a=0$ 或 $b=0$。所有比赛都是 $0:x$(当 $b=0$ 时是 $x:0$),其中 $x>0$。 2. 否则,我们先把最后两场比赛预留成 $1:0$ 和 $0:1$。我们让前 $n-2$ 场比赛全都变成 $1:0$ 或 $0:1$,然后把剩余的进球和失球分配给最后两场比赛。

代码

#include <cstdio>
int n,a,b;
int main()
{
    scanf("%d%d%d",&n,&a,&b);
    if(n==1){//情况一
        if(a==b) printf("1\n");
        else printf("0\n");
        printf("%d:%d",a,b);
    }
    else if(a+b<n){//情况二
        printf("%d\n",n-a-b);
        for(int i=1;i<=a;i++) printf("1:0\n");
        for(int i=1;i<=b;i++) printf("0:1\n");
        for(int i=1;i<=n-a-b;i++) printf("0:0\n");
    }
    else{//情况三
        printf("0\n");
        if(!a){
            for(int i=1;i<n;i++)
                printf("0:1\n");
            printf("0:%d",b-(n-1));
        }
        else if(!b){
            for(int i=1;i<n;i++)
                printf("1:0\n");
            printf("%d:0",a-(n-1));
        }
        else{
            a--,b--;//先预留 1:0 和 0:1 最后两场比赛
            for(int i=1;i<=n-2;i++){
                if(a>0){
                    printf("1:0\n");
                    a--;
                }
                else{
                    printf("0:1\n");
                    b--;
                }
            }
            printf("%d:0\n0:%d",a+1,b+1);//注意需要+1
        }
    }
}

求过qwq!