一、解题思路
如上图所示,类似于一个三角形的尖塔,每一行的项数和行数一致,每一行项数所代表的金币数量和行数一致。
因此,可以借着衍射出是一种 行数×项数 的问题,即可 i * j 或者 i * i
也因此,我们可以把行数设置为金币数,当一行的项数全部走完时,才能进入下一行,金币数才能增加,而项数则设置为天数,每走完一项,便走过一天。
而且随着向规定的天数不断靠近,可走的项数是不断地在减少的,所以需要进行天数的判断,判断剩余的天数是否能走完这一行的所有项。
转化为数学模型:
设 k 为天数。
设 i 为项数,同时 i 也表示行数 ,表示金币数。
i * i 是一个完整走完一行所有项的一个金币数,表示一行的金币数总量。
sum = 1 * 1 + 2 * 2 + 3 * 3 + 4 * 4 +…………+i * i (k>=i)——表示一行的项数能够走完
sum = 1 * 1 + 2 * 2 + 3 * 3 + 4 * 4 +…………+ k * i (k<i) ——表示一行走不完,有剩余的天数
二、代码如下:
int main()
{
int k;
int i = 1;
int result = 0;
scanf("%d", &k);
while (k > 0)
{
if (k >= i)
result += i * i;
else
result += k * i;
k -= i; //天数在不断的减少
i++; //完成 一行后 金币数需要加1
}
printf("%d\n", result);
return 0;
}
//k > = i 表示当天数大于等于项数时,可以走完一行,所以使用 i * i ,行数(金币数) × 项数
//k < i 表示当天数小于项数时,则要求该项所在的行数(金币数) * 天数 得到剩余天数的所有金币
三、这道题吗?转化为图是非常容易的🌝🌝🌝🌹