1 条题解

  • 0
    @ 2025-5-7 23:30:33

    问题理解

    我们需要计算骑士在给定天数内获得的金币总数。金币的发放模式如下:

    第1天:1枚金币(1天,每天1枚) 第2-3天:每天2枚金币(2天,每天2枚) 第4-6天:每天3枚金币(3天,每天3枚) 第7-10天:每天4枚金币(4天,每天4枚) ... 一般规律:对于任意正整数 N,在连续的 N 天里,每天收到 N 枚金币;然后在接下来的 N+1 天里,每天收到 N+1 枚金币。

    解决思路

    确定金币发放的块: 每个“块”由 N 天组成,每天发放 N 枚金币。 块的大小和金币数的关系:第 k 个块的金币数是 k,块的大小是 k。 例如: 块1:1天,每天1枚(第1天) 块2:2天,每天2枚(第2-3天) 块3:3天,每天3枚(第4-6天) 块4:4天,每天4枚(第7-10天) ... 计算总金币数: 对于给定的天数 n,我们需要找到所有完整的块和可能的部分块。 完整块的金币数是 块大小×块大小×块金币数。 部分块的金币数是 剩余天数×当前块金币数。 数学推导: 块的总数是 k,满足 1+2+3+⋯+k≤n。 即 2k(k+1)≤n。 解这个不等式可以找到最大的 k 使得 2k(k+1)≤n。 然后计算完整块的总和和部分块的总和。

    代码实现

    #include <iostream>
    #include <cstdio>
    using namespace std;
    
    int a[10001]; // 定义一个全局数组,用于存储数列
    
    int main() {
    	int n, j = 1, i = 1, temp = 1, sum = 0;
    	
    	// 生成数列
    	for (int i = 1; i <= 10000;) {
    		int k = j;
    		while (k > 0) {
    			sum += temp;
    			a[i++] = sum;
    			k--;
    		}
    		temp++;
    		j++;
    	}
    	
    	// 读取用户输入并输出结果
    	while (scanf("%d", &n) != EOF && n != 0) {
    		printf("%d %d\n", n, a[n]);
    	}
    	
    	return 0;
    }
    
    • 1

    信息

    ID
    1001
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者