华师一附中OI组
标题:
P2669 金币
[打印本页]
作者:
admin
时间:
2018-4-19 14:21
标题:
P2669 金币
题目描述
国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天和第三天),每天收到两枚金币;之后三天(第四、五、六天),每天收到三枚金币;之后四天(第七、八、九、十天),每天收到四枚金币……;这种工资发放模式会一直这样延续下去:当连续N天每天收到N枚金币后,骑士会在之后的连续N+1天里,每天收到N+1枚金币。
请计算在前K天里,骑士一共获得了多少金币。
输入输出格式
输入格式:
输入文件只有1行,包含一个正整数K,表示发放金币的天数。
输出格式:
输出文件只有1行,包含一个正整数,即骑士收到的金币数。
输入输出样例
输入样例#1:
6
输出样例#1:
14
输入样例#2:
1000
输出样例#2:
29820
说明
【输入输出样例 1 说明】
骑士第一天收到一枚金币;第二天和第三天,每天收到两枚金币;第四、五、六天,
每天收到三枚金币。因此一共收到 1+2+2+3+3+3=14 枚金币。
对于 100%的数据, 1 ≤ K ≤ 10,000。
优秀解法:
5楼
7楼
8楼
15楼
16楼
18楼
作者:
xpb
时间:
2018-4-20 20:19
#include<iostream>
using namespace std;
int k,i=1,jb,b;
bool b1,b2;
int main()
{
cin>>k;
for(;k>=i;i++)
{
k-=i;
b++;
}
for(i=1;i<=b;i++)
{
jb=jb+i*i;
}
if(k>0)
{jb=jb+k*(b+1);}
cout<<jb;
return 0;
}
b1 b2 有用吗?又是b,又是b1 b2 不怕搞错?
作者:
admin
时间:
2018-4-20 20:26
老师在这里用一个很直观的但是有点笨的方法,先将数字写到数组,1个1,2个2,3个3,4个4,然后去累加前k个,很有些浪费,但是很直观。
#include<iostream>
using namespace std;
int s,k,a[11000],i,j,t;
int main()
{
t=i=1;///初始值
while (t<=10000)
{
for (j=1; j<=i; j++)
{
a[t]=i; ///写进数组 很直观
t++;
}
i++; ///写下一次数字
}
///for (i=1; i<=100; i++) cout<<a[i]<<' ';
cin>>k;
s=0;for (i=1;i<=k;i++) s=s+a[i]; ///前k项求和
cout<<s;
return 0;
}
复制代码
第二种做法,直接一遍数一边加,注意我的循环的跳出技巧和边界条件,不熟悉的同学做做这个二阶等差数列的题目
#include<iostream>
using namespace std;
int s,k,l,i,j,t;
int main()
{
cin>>k;
s=t=i=0;///初始值 t表示现在是第几个数,i表示这个数值是几 s表示总和
while (t<k) ///找到第k个的i
{
for(j=1; (j<=i) && (t<k); j++) ///注意这个出口的写法!
{
t++;
///cout<<i<<' ';
s+=i;
}
i=i+1;
}
cout<<s;
return 0;
}
复制代码
加强版的题目 “
http://www.hsyit.cn/forum.php?mo ... &extra=page%3D1
作者:
GTR
时间:
2018-4-20 20:26
#include <iostream>
#include <cstdio>
using namespace std;
long long int n,i,s,s1;
int main()
{
cin>>n;
s1=1;
while(n>0)
{
for(i=1;i<=s1;i++)
{
s+=s1;
n--;
if(n==0) break;
}
s1++;
}
cout<<s<<endl;
return 0;
}
复制代码
作者:
黄煦喆
时间:
2018-4-21 19:40
#include<iostream>
using namespace std;
int n,k;
long long s,m;
int main()
{
cin>>n;
if(n<=1){cout<<n;return 0;}
while(k*k+k<=2*n)k++;
k--;
for(int i=1;i<=k;i++)s+=i*i;
m=(k+1)*(n-k*(k+1)/2);
s+=m;
cout<<s;
return 0;
}
复制代码
老师点评: 思路正确,找最后一堆数字,,然后前面的满的,加上后面的一部分。但是细节不完美,比如第9行,累加过程。
作者:
张笑宇
时间:
2018-4-21 19:42
#include<iostream>
using namespace std;
int k,i,s,x;
long long sum;///sum为结果
int main()
{
cin>>k;
s=1,sum=0,x=1;///x为计数器,表示在s内已经加到了x
for (i=1;i<=k;i++)
{
sum=sum+s;
x++;
if (x>=s) x=0,s++;///如果已经加完了s个s,就s++
}
cout<<sum;
return 0;
}
复制代码
作者:
王令欧
时间:
2018-4-21 19:43
#include <stdio.h>
int main()
{
int n=1,k,i=0,ans=0,j;
scanf("%d",&k);
while(i<k)
for(j=1;j<=n;j++)
{
i++;
ans+=n;
if(j==n)
{
n++;
break;
}
if(i==k)
break;
}
printf("%d",ans);
return 0;
}
复制代码
仔细考虑下看能不能不要用 break
作者:
Scorpio
时间:
2018-4-21 19:49
#include<iostream>
using namespace std;
int k,i,j,s,c;
int main()
{
cin>>k;
for(i=1;;i++)
for(j=1;j<=i;j++)
{
s=s+i;
c++;
if(c==k)
{
cout<<s;
return 0;
}
}
return 0;
}
复制代码
作者:
黄诗绮
时间:
2018-4-21 20:44
#include <iostream>
using namespace std;
int main()
{
int K,N,g=0,i,j;
cin>>K;
for(i=1;;i++){
j=0;
while(j<i){
g+=i;
j++;
N++;
if(N==K) cout<<g<<endl;
break;
}
}
return 0;
}
复制代码
作者:
胡炜尧
时间:
2018-5-17 21:50
提示:
作者被禁止或删除 内容自动屏蔽
作者:
WJL
时间:
2018-5-23 21:44
本帖最后由 WJL 于 2018-8-9 20:14 编辑
#include<iostream>
using namespace std;
int s,j;
int c=0,i=1;
int main()
{cin>>s;
for(;i<=s;i++)
s-=i;
for(j=1;j<=i-1;j++)
c+=j*j;
cout<<c+s*i<<endl;
复制代码
作者:
admin
时间:
2018-5-24 11:10
楼上WJL的这个做法不错!但是这两个循环可否合二为一?
作者:
吴语林
时间:
2018-6-25 09:42
#include <algorithm>
#include <iostream>
#include <cmath>
#include <cstring>
#include <map>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <cstdio>
#include <cstdlib>
using namespace std;
int k,n,all=0;
int main()
{
scanf("%d",&k);
for(n=1;k>=n;k-=n,n++)
all+=n*n;
printf("%d\n",all+k*n);
return 0;
}
复制代码
作者:
冯文韬
时间:
2018-6-25 09:43
#include<iostream>
using namespace std;
int main(){
int n,ans(0),i;
cin>>n;
for (k=1;n-i>=0;n-=i++){
ans+=i*i;
}
cout<<ans+i*n;
return 0;
}
复制代码
作者:
universehyf
时间:
2018-6-25 09:45
#include<iostream>
using namespace std;
int main()
{
int a=0,s=0,i,j,b;
cin>>b;
for(i=1;a<b;i++)
{
for(j=1;j<=i;j++)
{
++a;
if(a>b) break;
s+=i;
}
}
cout<<s;
return 0;
}
作者:
BJpers2
时间:
2018-6-25 09:46
#include<iostream>
using namespace std;
int n,x,ans;
int main(){
cin>>n;
while(n>0) ans+=n,n-=++x;
cout<<ans;
}
复制代码
作者:
倚窗倾听风吹雨
时间:
2018-6-26 16:43
#include<iostream>
using namespace std;
int s,i,j,x=1,n;
int main()
{
cin>>n;
for(i=1;x<=n;i++)
{
for(j=1;(j<=i)&&(x<=n);j++)
{
s+=i;
x++;
}
}
cout<<s<<endl;
return 0;
}
复制代码
作者:
酱油咸
时间:
2018-7-2 22:38
#include<iostream>
using namespace std;
int s,k,a[11000],i,j,t;
int main()
{
t=i=1;
while (t<=10000)
{
for (j=1; j<=i; j++)
{
a[t]=i;
t++;
}
i++;
}
cin>>k;
s=0;for (i=1;i<=k;i++) s=s+a[i];
cout<<s;
return 0;
}
复制代码
作者:
吴语林
时间:
2018-7-29 21:45
#include <algorithm>
#include <iostream>
#include <cmath>
#include <cstring>
#include <map>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <cstdio>
#include <cstdlib>
using namespace std;
int k,n=0,all=0;
int main()
{
scanf("%d",&k);
for(n=1;k-n>=0;k-=n,n++)
all+=n*n;
printf("%d\n",all+k*n);
return 0;
}
复制代码
作者:
admin
时间:
2018-7-29 22:13
吴同学这个做法好!
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2