金币问题解析

闾丘选
2023-12-01

题目:国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天和第三天),每天收到两枚金币;之后三天(第四、五、六天),每天收到三枚金币;之后四天(第七、八、九、十天),每天收到四枚金币……;这种工资发放模式会一直这样延续下去:当连续N天每天收到N枚金币后,骑士会在之后的连续N+1天里,每天收到N+1枚金币。
请计算在前K天里,骑士一共获得了多少金币。
输入描述:
输入只有1行,包含一个正整数K,表示发放金币的天数。
输出描述:
输出只有1行,包含一个正整数,即骑士收到的金币数。
示例1
输入:
6
复制
输出:
14
复制
说明:
骑士第一天收到一枚金币;第二天和第三天,每天收到两枚金币;第四、五、六天,每天收到三枚金币。因此一共收到1+2+2+3+3+3=14枚金币。
题目解析:首先可以试着把转为数学问题去想,把每次连续得到相同金币的天数看成一个周期。
比如:1 22 333 444 555 ········mmm······
从上面我们不难发现,从第一周期到m周期,而周期数就等于每个周期的总天数也等于周期数中每天得到的金币数,每个周期的金币总数等于每个周期总天数的平方。 我们不妨设天数为k,k天时所在周期区域为第m个周期。

根据公式总天数=(首项+末项)乘以项数/2,即总数=(1+m)乘以m/2,总金币数=每个周期天数平方之和=m*(m+1)(2m+1)/6(这是一个公式)。

又分为种情况:
第一种:k天正好对应第m个周期的最后一天,这是最好的情况,直接用应用文本中的公式即可。
第二种:k天对应到m周期的某一天,这时总金币数=第一周期的金币数到第m-1个周期金币数之和+(k-第一周期的天数到第(m-1)个周期的天数之和)*m。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
	int m = 1;//周期数
	int k = 0;天数
	int ans = 0;//总金币数
	scanf("%d", &k);
	while ((1 + m) * m / 2 <= k)
	{
		m++;
	}
	m--;
	ans = m * (m + 1) * (2 * m + 1) / 6 + (k - (1 + m) * m / 2) * (m + 1);
	printf("%d", ans);
	return 0;
}

以上就是我的见解。

 类似资料: