1.题目描述
哀酱有许多红色和蓝色的乳球。现在,他将把它们排成一行。 最初,一个球都没有。 非常有耐心的哀酱将执行以下操作10^100次: 在已放置的球的末尾放置A个蓝球。然后,在行的末尾放置B个红球。 在这种方式制作的一行球的前N个球中,会有多少个蓝球? (哀酱最近智商捉急,你能帮帮她吗?) 输入 输入一行,三个整数N,A,B,其中1≤N≤10^18,A,B≥0,0<A+B≤10^18 输出 输出在这种方式制作的一行球的前N个球中将有多少个蓝球。 样例输入 Copy 【样例1】 8 3 4 【样例2】 8 0 4 【样例3】 6 2 4 样例输出 Copy 【样例1】 4 【样例2】 0 【样例3】 2 。
拿到题目就先要分析样例:
样例1解释 用b表示一个蓝球,用r表示一个红球。排列中的前八个球将是bbbrrrrb,其中有4个蓝球。 样例2解释 从一开始她只放置了红球。 样例3解释 在bbrrrr中,有2个蓝球。
2.代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
long long n,a,b;//a表示蓝球,b表示红球
cin >> n >> a >> b;
if (a == 0)//当没有蓝色的球时,直接输出0
{
cout << 0 << endl;
return 0;
}
if (n % (a + b) > a)//当出现12 3 4这样的情况时
{
cout << n / (a + b) * a + a << endl;
}
else
{
cout << n / (a + b) * a + n % (a + b) << endl;
}
return 0;
}
3.解题思路
先看看这道题的错率
提交 48 用户(提交) 22 用户(解决) 14 正确 15 答案错误 16 时间超限 9 运行错误 8 正确[31%]答案错误[33%]时间超限[19%]运行错误[17%]
这道题其实是一道选择结构的思维水题,估计有很多人在看到这道题时以为是一道顺序结构的题目,直接输出了n / (a + b) * a + n % (a + b)。这样的话只能得到70分。不妨我们就先看看这个70分的代码有什么道理吧(就是说它为什么可以得到70分,而不是0分)。
先解释这道题的意思吧。实际上这道题就是在说先放置蓝球a个,再放置红球b个,看看从左往右前n个有几个蓝球。n / (a + b)就是在说放置篮球和红球总体的有几组,比如 8 3 4这个数据。就是放置了一遍蓝球和红球(每组3个蓝球和4个红球)。还有可能多出来几个蓝球。那么就是n %(a + b)个蓝球。
那么为什么这个公式只能得到70分呢?实际上在回过头来看上一个自然段中我标注红色的句子,就能发现端倪——有没有可能还多出来红球呢?就比如说12 3 4这组数据。n % (a + b)之后为5,也就是多出来的5个球,可是这5个球中,还有2个红球呢!!!所以,如果你直接输70分的答案,那么12 3 4这组数据的结果是8,但正确结果是6。
那么怎么才能得到100分呢?我们就需要分支判断:第一个分支输多出来的球只有蓝球的答案(比如8 3 4),第二个分支输多出来的球不止蓝球的答案(比如12 3 4)。将其变成c++的语言就是“n % (a + b) > a”和"n % (a + b) <= a"(后者直接else判断即可)。
4.总结
这道题错误原因很可能在于考虑不充分,看着样例有3个,就思维定式地以为只有这3种情况。那么跳出这种思维定时的方法只有多练习,当然还要长记性,遇到简单题就要自己动手造样例,否则就会错得惨不忍睹。
5.
-不多说了-