题目描述
第一天,骑士收到一枚金币;之后两天(第二天和第三天),每天收到两枚金币;之后三天(第四、五、六天),每天收到三枚金币;之后四天(第七、八、九、十天),每天收到四枚金币……。
这种工资发放模式会一直这样延续下去:当连续 N 天每天收到 N 枚金币后,骑士会在之后的连续 N+1 天里,每天收到 N+1 枚金币。
请计算在前 K 天里,骑士一共获得了多少金币
输入天数,求从第一天到这一天的总金币数
洛谷题面
输入样例
6
输出样例
14
分析
可以总结一下题意:
如图,我们可以知道我们要掌握两个变量:”总金币数”,”天数”
总金币数:s
天数:s1
接下来就要去考虑怎样构建这两个变量来解题了
要求总金币数,就要累加每一天的金币
所以我们先要模拟每一天的金币数成为这个样子:
1 2 2 3 3 3 4 4 4 4 5 5 ......
我们先观察上面这一串数字
不难想到要用双层循环
一层循环这个:
另一层循环里面的数字
于是:(这里不懂的话建议你模拟一下)
for(int i=1;i<=k;i++){
for(int j=1;j<=i;j++){
s=s+i;
}
}
然后还要模拟天数
如图,可以用这个规律来记录天数
(这里不懂的话建议你模拟一下)
for(int i=1;i<=k;i++){
s1=s1+i; //记录被圈出来的这类天数
for(int j=1;j<=i;j++){
s=s+i;
}
}
不过还要有些判断条件:
如果输入的天数刚好就是上一副图圈出来的那类数字
那么就直接输出当前金币总数:
if(s1==k){
cout<<s;
return 0;
}
如果输入的天数不是上一副图圈出来的那类数字
(这里不懂的话建议你模拟一下)
if(s1-i<k&&k<s1){ //判断输入的天数是不是上一副图圈出来的那类数字
c=s1-k; //记录一下 这次记录的天数 和 输入的天数 的距离(多出来的天数)
cout<<s-c*i; //输出 这次记录的天数所对应的金币总数 减去 多出来天数的总金币数
return 0;
}
c++代码
#include<iostream>
using namespace std;
int a[1005];
int main(){
int k,c;
cin>>k;
int s=0,s1=0;
for(int i=1;i<=k;i++){
// a[i]=i;
s1=s1+i;
for(int j=1;j<=i;j++){
s=s+i;
}
if(s1==k){
cout<<s;
return 0;
}
if(s1-i<k&&k<s1){
c=s1-k;
cout<<s-c*i;
return 0;
}
}
return 0;
}