金币

洛谷P2669 [NOIP2015 普及组] 金币

题目描述

国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天和第三天),每天收到两枚金币;之后三天(第四、五、六天),每天收到三枚金币;之后四天(第七、八、九、十天),每天收到四枚金币……;这种工资发放模式会一直这样延续下去:当连续N天每天收到N枚金币后,骑士会在之后的连续N+1天里,每天收到N+1枚金币。

请计算在前K天里,骑士一共获得了多少金币。

输入格式

一个正整数K,表示发放金币的天数。

输出格式

一个正整数,即骑士收到的金币数。

输入输出样例
输入#1

6

输出#1

14

原题链接:https://www.luogu.com.cn/problem/P2669

理解分析:

题目要求出“前K天里,骑士一共要获得的金币数”,由于金币数=1 * 1 + 2 * 2 + 3 * 3 + … + N * N(可能不会恰好N天,但可以最后减掉算多了的部分),所以关键要找出骑士在第K天里能拿到的金币数量。

代码实现:

#include <iostream>
using namespace std;

int K, M, N, m; //K 天数; M 中间比较量; N 连续N天发N枚金币; m 表示金币数 

int main()
{
	cin >> K;
	while(M < K)  //计算骑士在一天里能拿到的金币最大数N 
	{
		N++;
		M += N;
	}
	for(int i = 1; i <= N; i++)//连续i天拿了i枚,则连续i天里拿到金币的总数为i*i,假设有连续N天拿了N枚金币 
		m += i * i; 
	m -= (M - K) * N;   //减去算多的天数里拿的金币 
	cout << m << endl; 
	return 0; 
}

部分代码解释:

在写循环的代码时,一定要注意循环条件的设置,譬如这里<后面不能再加一个=。写代码细节一定要抠到位,不然就会出现WA很久却不知道为什么,激心为什么一直不能全AC。

	while(M < K)  //计算骑士在一天里能拿到的金币最大数N 
	{
		N++;
		M += N;
	}

思考总结:

有时候在解决问题时可以从问题本身倒推回去寻找解决问题的方法。譬如本题要求金币数量,我们可以进一步思考金币数量如何求,便得出得求N的结论,再进一步思考N如何求,一步一步回推思考,最后解决问题。

编程是一门艺术!希望读者在编程中找到乐趣!

如果读者有不懂的地方或是博主有说错的地方,欢迎在下方留言!

如果觉得本文有帮助到您,请点击下方一键三连,助力一下博主!(ノ◕ω◕)ノx₍₍◡( ╹◡╹ )◡₎₎╰( ´・ω・)つ──☆✿✿✿ 感谢!感谢!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值