题解 | #[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,多几天就退几天的金币。