华师一附中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个,很有些浪费,但是很直观。
  1. #include<iostream>
  2. using namespace std;
  3. int s,k,a[11000],i,j,t;
  4. int main()
  5. {
  6.     t=i=1;///初始值
  7.     while (t<=10000)
  8.     {
  9.         for (j=1; j<=i; j++)
  10.         {
  11.             a[t]=i;  ///写进数组 很直观
  12.             t++;
  13.         }
  14.         i++; ///写下一次数字
  15.     }
  16.     ///for (i=1; i<=100; i++) cout<<a[i]<<' ';
  17.     cin>>k;
  18.     s=0;for (i=1;i<=k;i++) s=s+a[i];  ///前k项求和
  19.     cout<<s;
  20.     return 0;
  21. }
复制代码



第二种做法,直接一遍数一边加,注意我的循环的跳出技巧和边界条件,不熟悉的同学做做这个二阶等差数列的题目
  1. #include<iostream>
  2. using namespace std;
  3. int s,k,l,i,j,t;
  4. int main()
  5. {
  6.     cin>>k;
  7.     s=t=i=0;///初始值 t表示现在是第几个数,i表示这个数值是几 s表示总和
  8.     while (t<k)  ///找到第k个的i
  9.     {
  10.         for(j=1; (j<=i) && (t<k); j++)  ///注意这个出口的写法!
  11.         {
  12.             t++;
  13.             ///cout<<i<<' ';
  14.             s+=i;
  15.         }
  16.          i=i+1;
  17.     }
  18.     cout<<s;

  19.     return 0;
  20. }
复制代码



加强版的题目 “  http://www.hsyit.cn/forum.php?mo ... &extra=page%3D1
作者: GTR    时间: 2018-4-20 20:26
  1. #include <iostream>
  2. #include <cstdio>
  3. using namespace std;
  4. long long int n,i,s,s1;
  5. int main()
  6. {
  7.     cin>>n;
  8.     s1=1;
  9.     while(n>0)
  10.     {
  11.         for(i=1;i<=s1;i++)
  12.         {
  13.             s+=s1;
  14.             n--;
  15.             if(n==0) break;
  16.         }
  17.         s1++;
  18.     }
  19.     cout<<s<<endl;
  20.     return 0;
  21. }
复制代码

作者: 黄煦喆    时间: 2018-4-21 19:40
  1. #include<iostream>
  2. using namespace std;
  3. int n,k;
  4. long long s,m;
  5. int main()
  6. {
  7.     cin>>n;
  8.     if(n<=1){cout<<n;return 0;}
  9.     while(k*k+k<=2*n)k++;
  10.     k--;
  11.     for(int i=1;i<=k;i++)s+=i*i;
  12.     m=(k+1)*(n-k*(k+1)/2);
  13.     s+=m;
  14.     cout<<s;
  15.     return 0;
  16. }
复制代码


老师点评: 思路正确,找最后一堆数字,,然后前面的满的,加上后面的一部分。但是细节不完美,比如第9行,累加过程。
作者: 张笑宇    时间: 2018-4-21 19:42
  1. #include<iostream>
  2. using namespace std;
  3. int k,i,s,x;
  4. long long sum;///sum为结果
  5. int main()
  6. {
  7.     cin>>k;
  8.     s=1,sum=0,x=1;///x为计数器,表示在s内已经加到了x
  9.     for (i=1;i<=k;i++)
  10.     {
  11.         sum=sum+s;
  12.         x++;
  13.         if (x>=s) x=0,s++;///如果已经加完了s个s,就s++
  14.     }
  15.     cout<<sum;
  16.     return 0;
  17. }
复制代码

作者: 王令欧    时间: 2018-4-21 19:43
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         int n=1,k,i=0,ans=0,j;
  5.         scanf("%d",&k);
  6.         while(i<k)
  7.                 for(j=1;j<=n;j++)
  8.                 {
  9.                         i++;
  10.                         ans+=n;
  11.                         if(j==n)
  12.                         {
  13.                                 n++;
  14.                                 break;
  15.                         }
  16.                         if(i==k)
  17.                                 break;
  18.                 }
  19.         printf("%d",ans);
  20.         return 0;
  21. }
复制代码


仔细考虑下看能不能不要用 break
作者: Scorpio    时间: 2018-4-21 19:49
  1. #include<iostream>
  2. using namespace std;
  3. int k,i,j,s,c;
  4. int main()
  5. {
  6.     cin>>k;
  7.     for(i=1;;i++)
  8.         for(j=1;j<=i;j++)
  9.         {
  10.             s=s+i;
  11.             c++;
  12.             if(c==k)
  13.             {
  14.                 cout<<s;
  15.                 return 0;
  16.             }
  17.         }
  18.     return 0;
  19. }
复制代码


作者: 黄诗绮    时间: 2018-4-21 20:44
  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5.         int K,N,g=0,i,j;
  6.         cin>>K;
  7.         for(i=1;;i++){
  8.                 j=0;
  9.                 while(j<i){
  10.                         g+=i;
  11.                         j++;
  12.                         N++;
  13.                         if(N==K) cout<<g<<endl;
  14.                         break;
  15.                 }
  16.         }
  17.         return 0;
  18. }
复制代码

作者: 胡炜尧    时间: 2018-5-17 21:50
提示: 作者被禁止或删除 内容自动屏蔽
作者: WJL    时间: 2018-5-23 21:44
本帖最后由 WJL 于 2018-8-9 20:14 编辑

  1. #include<iostream>
  2. using namespace std;
  3. int s,j;
  4. int c=0,i=1;
  5. int main()
  6. {cin>>s;
  7. for(;i<=s;i++)
  8. s-=i;
  9. for(j=1;j<=i-1;j++)
  10. c+=j*j;
  11. cout<<c+s*i<<endl;
复制代码

作者: admin    时间: 2018-5-24 11:10
楼上WJL的这个做法不错!但是这两个循环可否合二为一?
作者: 吴语林    时间: 2018-6-25 09:42
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <cmath>
  4. #include <cstring>
  5. #include <map>
  6. #include <string>
  7. #include <vector>
  8. #include <queue>
  9. #include <stack>
  10. #include <cstdio>
  11. #include <cstdlib>
  12. using namespace std;
  13. int k,n,all=0;
  14. int main()
  15. {
  16.     scanf("%d",&k);
  17.     for(n=1;k>=n;k-=n,n++)
  18.         all+=n*n;
  19.     printf("%d\n",all+k*n);
  20.     return 0;
  21. }
复制代码

作者: 冯文韬    时间: 2018-6-25 09:43
  1. #include<iostream>
  2. using namespace std;
  3. int main(){
  4.     int n,ans(0),i;
  5.     cin>>n;
  6.     for (k=1;n-i>=0;n-=i++){
  7.         ans+=i*i;
  8.     }
  9.     cout<<ans+i*n;
  10.     return 0;
  11. }
复制代码

作者: 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
  1. #include<iostream>
  2. using namespace std;
  3. int n,x,ans;
  4. int main(){
  5.         cin>>n;
  6.         while(n>0) ans+=n,n-=++x;
  7.         cout<<ans;
  8. }
复制代码

作者: 倚窗倾听风吹雨    时间: 2018-6-26 16:43
  1. #include<iostream>
  2. using namespace std;
  3. int s,i,j,x=1,n;
  4. int main()
  5. {
  6.     cin>>n;
  7.     for(i=1;x<=n;i++)
  8.     {
  9.         for(j=1;(j<=i)&&(x<=n);j++)
  10.         {
  11.             s+=i;
  12.             x++;
  13.         }
  14.     }
  15. cout<<s<<endl;
  16.   return 0;
  17. }
复制代码

作者: 酱油咸    时间: 2018-7-2 22:38
  1. #include<iostream>
  2. using namespace std;
  3. int s,k,a[11000],i,j,t;
  4. int main()
  5. {
  6.     t=i=1;
  7.     while (t<=10000)
  8.     {
  9.         for (j=1; j<=i; j++)
  10.         {
  11.             a[t]=i;  
  12.             t++;
  13.         }
  14.         i++;
  15.     }
  16.     cin>>k;
  17.     s=0;for (i=1;i<=k;i++) s=s+a[i];  
  18.     cout<<s;
  19.     return 0;
  20. }
复制代码

作者: 吴语林    时间: 2018-7-29 21:45
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <cmath>
  4. #include <cstring>
  5. #include <map>
  6. #include <string>
  7. #include <vector>
  8. #include <queue>
  9. #include <stack>
  10. #include <cstdio>
  11. #include <cstdlib>
  12. using namespace std;
  13. int k,n=0,all=0;
  14. int main()
  15. {
  16.     scanf("%d",&k);
  17.     for(n=1;k-n>=0;k-=n,n++)
  18.         all+=n*n;
  19.     printf("%d\n",all+k*n);
  20.     return 0;
  21. }
复制代码

作者: admin    时间: 2018-7-29 22:13
吴同学这个做法好!




欢迎光临 华师一附中OI组 (http://hsyit.cn/) Powered by Discuz! X3.2