c++ 数球(思维水题)取余的应用

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.

-不多说了-

  • 12
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值