题解:P12795 [NERC 2022] Football

· · 题解

题解:P12795 [NERC 2022] Football

题意:

n 场比赛中,踢进 a,个球,踢丢 b 个球。

题目要求求出最小平局数并输出一个比分列表,满足有 d 场平局,其他比赛非平局。

主要思路: 观察可以发现平局场次的进球和失球数必须相等,即每场平局消耗的 ab 相同。所以剩余比赛需分配剩余的 a' = a - sum(x_i)b' = b - sum(y_i),且所有非平局比赛必须满足 x_i ≠ y_i


#include<bits/stdc++.h>
using namespace std;

int main(){
    int n,a,b;
    cin>>n>>a>>b;

    // 单场比赛情况
    if(n==1){
        if(a==b) cout<<"1\n"<<a<<':'<<b<<"\n";
        else cout<<"0\n"<<a<<':'<<b<<"\n";
    }
    // 总进球数不足n场的情况
    else if(a+b<n){
        cout<<n-a-b<<"\n";
        for(int i=1;i<=a;i++) puts("1:0");
        for(int i=1;i<=b;i++) puts("0:1");
        for(int i=1;i<=n-a-b;i++) puts("0:0");
    }
    // 正常情况
    else{
        cout<<"0\n";
        // 无失球情况
        if(b==0){
            for(int i=1;i<n;i++) puts("1:0");
            printf("%d:0",a-n+1);
        }
        // 进球数不足n-1场
        else if(a<n-1){
            for(int i=1;i<=a;i++) puts("1:0");
            for(int i=1;i<=n-a-1;i++) puts("0:1");
            printf("0:%d",b-(n-a-1));
        }
        // 一般情况
        else{
            for(int i=1;i<n-1;i++) puts("1:0");
            printf("%d:0\n0:%d",a-(n-2),b);
        }
    }
    return 0;
}