题解 | #[NOIP2015]金币#
[NOIP2015]金币
https://www.nowcoder.com/practice/8f71f5670e6a45118d24d13868a2da9e
#include <stdio.h>
int main() {
int k, i = 0, sum = 0;
int days;
scanf("%d", &k);
for (i = 1,days=0; days<k;i++)
{
days += i;
sum += i * i;
}
//计算days天获得了sum个金币
i--;
if (days == k) //days恰好等于k的情况
printf("%d", sum);
else //days>k的情况,往前扣金币
{
while (days-k!=0)
{
sum -= i;
days--;
}
printf("%d", sum);
}
}
虽然解法没那么好,但是你就说A了没。
把1、2+2、3+3+3、4+4+4+4分别当做一个周期,days只取每个周期末尾的那一天,并计算days天获取的金币
days取值只能是1,3,6,10…….。直到days第一次不小于k为止。
如果days恰好等于k,则直接输出金币总和,如果days大于k,多几天就退几天的金币。
三奇智元机器人科技有限公司公司福利 64人发布
