专栏文章

题解:P14477 图寻中国

P14477题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@min81w2s
此快照首次捕获于
2025/12/01 22:05
3 个月前
此快照最后确认于
2025/12/01 22:05
3 个月前
查看原文

P14477图寻中国 题解

题可以推公式

题意重述

给出一连串对局的总局数 nn,再给出对局中最长连胜 aa 和最长连败 bb,求符合以上条件的最大胜利数。

思路分析

虽然题目要求胜利尽可能多,但为了不超过最大连胜局数,必须要在胜利 aa 局后立刻输一局来分割连胜。就有两种情况:
  1. 如果最长连败为 00(也就是 b=0b=0),则分隔直接使用 11 局失败即可,共重复 Cn÷(a+1)C\gets n\div (a+1) 个胜 aa 局,败 11 局的周期。若 nmod(a+1)0n\mod (a+1) \ne 0,即还有剩余局数没有比完,则使其全胜利即可,因为可以证明 nmod(a+1)an\mod (a+1) \le a
  2. 如果最长连败非 00(也就是 b>0b>0),则可以先将 aa 局胜利和 bb 局失败比掉,新增一个变量 C2nabC_2 \gets n-a-b(即剩余的局数),剩下的按照 b=0b=0 的情况处理即可,最后别忘了加上一开始连胜的 aa
根据上面的分析,可以得出两种情况所对应的公式:
第一种情况:(C×a)+(nmod(a+1))(C\times a)+(n\mod (a+1))CC 组乘以每组连胜数加剩余的连胜局数。
第二种情况:(C2÷(a+1))×a+(C2mod(a+1))+a(C_2\div(a+1))\times a+(C_2\mod(a+1))+a 即组数乘每组连胜数加上剩余胜利数加上一开始连胜的a。

代码

CPP
#include<bits/stdc++.h>
using namespace std;
int main(){
    long long n,a,b;
    cin>>n>>a>>b;
	if(b==0){//判断是否b=0,若是则按第一种情况处理
        int c=n/(a+1);
		int x=c*a;
		cout<<x+n%(a+1);//此处为了方便阅读将第一种情况的公式拆成三段,意义和结果不变
    }
    else{ //否则按第二种情况处理
        int c=n-a-b;
        int x=c/(a+1);
        cout<<x*a+a+c%(a+1);//此处为了方便阅读将第二种情况的公式拆成三段,意义和结果不变
    }
    return 0;//The End and AC!
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...