Hello 大家好我是小亦,今天呢我一整天都没有更新了,因为今天有学业在身,所以有点耽误出题解了,好那么好今天我们来讲得是来自NOIP2015年普及组的真题“金币~”,这道题如果放在这里非常非常的水啊,这还是国内吗,额不废话了,那么好思路公布给大家qwq:
首先呢这道题是让我们求模拟和数学就行了,非常的水,那么不多说已下呢是我搞出来的步骤,慢慢看~
-
理解模式:首先理解金币发放的模式。骑士在连续 nn 天每天收到 nn 枚金币,然后进入下一轮,连续 n+1 天每天收到 n+1 枚金币。
-
初始化变量:设置变量来跟踪当前的天数、每天收到的金币数以及到目前为止收到的金币总数。
-
循环处理:使用循环来模拟金币的发放过程。在每次循环中,计算当前阶段(即连续 nn 天)的金币总数,并累加到总金币数中。
-
更新天数:在每次循环结束时,更新剩余的天数。如果剩余天数不足以完成一个完整的阶段,则需要特殊处理剩余的天数。
-
计算剩余天数:如果经过一个完整的阶段后仍有剩余天数,计算剩余天数对应的金币数,并将其加到总数中。
-
输出结果:循环结束后,输出计算得到的总金币数。
详细步骤
-
初始化:设置初始值,
day
为当前阶段的天数(初始为1),coin
为当前每天收到的金币数(初始也为1),sum
为收到的金币总数(初始为0)。 -
循环:使用一个循环来处理每个阶段。在循环中:
- 计算当前阶段的金币数:
coin * min(k, day * coin)
。这里使用min
函数是为了处理剩余天数不足以完成一个完整阶段的情况。 - 更新总金币数:
sum += coin * min(k, day * coin)
。 - 减少剩余天数:
k -= day * coin
。这里乘以day
是因为每个阶段的天数是连续的。
- 计算当前阶段的金币数:
-
更新阶段:在每次循环结束时,更新到下一个阶段。即增加
day
和coin
的值。 -
结束循环:当
k
减到0或更少时,结束循环。 -
输出结果:循环结束后,
sum
包含了前k
天收到的金币总数,输出这个值。
这个思路可以确保我们正确地计算出在前 k
天里,骑士一共获得了多少金币,嗯我这么说大家应该能理解吧,好那么好,赶紧把代码供上,在这里小亦再次再次提醒大家,抄代码可耻
#include <iostream>
using namespace std;
int main() {
int k;
cin >> k;
int day = 1, coin = 1, sum = 0;
while (k > 0) {
int days = day;
sum += coin * min(k, days);
k -= days;
day++;
coin++;
}
cout << sum << endl;
return 0;
}
由于这道题过于简单,注释不提供了哈,代码包队的