循环结构中洛谷p2669金币问题

13f9e74347de42d19b51b400012d0177.png

d2ceab5035ed4a72b91f35f930e7f657.png

一、解题思路

bc8d8c0358a648459652d2aeb29afb16.png

如上图所示,类似于一个三角形的尖塔,每一行的项数和行数一致,每一行项数所代表的金币数量和行数一致。

因此,可以借着衍射出是一种 行数×项数 的问题,即可 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 表示当天数小于项数时,则要求该项所在的行数(金币数) * 天数 得到剩余天数的所有金币

三、这道题吗?转化为图是非常容易的🌝🌝🌝🌹

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值