题目描述
国王用付给他忠诚的骑士金币。在服役的第一天,骑士收到了一枚金币。在之后两天的每一天(服役的第二第三天),骑士收到两枚金币。在之后三天的每一天(服役的第四五六天),骑士收到三枚金币。这种支付模式将不限期地继续下去:在连续的 n 天每天收到 n 枚金币之后,骑士将会在接下来的 n+1 天每天收到 n+1 枚金币,这里 n 是一个任意的正整数。
你的程序要判定在任意给定的天数骑士累计收到了多少枚金币(从第一天开始)。
输入
输入包含至少一,但是至多二十一行。输入的每行(除了最后一行)包含问题的一组测试实例,一组实例是一个整数(在 1...10000 范围内),代表天数。输入的结束以包含一个数 0 的行表示。
输出
对于每组测试实例将有一行。这一行包含来自对应输入行的天数,接下来是一个空格和从第一天到给定的天数里,骑士收到的金币数。
来源
Rocky Mountain 2004
思路
数据比较小,直接模拟。另外算一下的话可以 O(1),这里就不算了。
代码
#include <stdio.h> const int MAXN = 10000 + 5; int pay[MAXN]; int main() { int now = 1; int cnt = 0; for (int i = 1; i < MAXN; i++) { pay[i] = now; cnt++; if (cnt == now) { now++; cnt = 0; } } for (int i = 1; i < MAXN; i++) pay[i] += pay[i - 1]; for (int n; scanf("%d", &n) && n; ) printf("%d %d\n", n, pay[n]); return 0; }
时间: 2024-10-15 17:04:01