1 条题解
-
0
自动搬运
来自洛谷,原作者为

alice_c
【此楼已隐藏】(按Ctrl+W显示隐藏信息)搬运于
2025-08-24 23:18:06,当前版本为作者最后更新于2025-07-19 15:19:34,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
题意
球队参加了 场比赛,已知总进球数 ,总失球数 ,求最少平局次数和具体方案。
思路
一道构造题,分类讨论:
-
,只有一场比赛。我们决定不了能平局几次。直接输出比赛结果即可,如果 则平局次数为 ,否则为 。
-
,进球数加上失球数少于比赛次数。这说明肯定有几场比赛是 平局。为了让平局次数尽可能少,我们让其他那些比赛为 或 。最多只能有 场 , 场 ,剩下 场都是 平局。
-
。肯定可以构造出一种没有平局的方案。这种情况还可以分成两种:
- 或 。所有比赛都是 (当 时是 ),其中 。
- 否则,我们先把最后两场比赛预留成 和 。我们让前 场比赛全都变成 或 ,然后把剩余的进球和失球分配给最后两场比赛。
代码
#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!
-
- 1
信息
- ID
- 12522
- 时间
- 3000ms
- 内存
- 1024MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者