华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 4466|回复: 21
打印 上一主题 下一主题

P2669 金币

[复制链接]

738

主题

1485

帖子

5422

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5422
跳转到指定楼层
楼主
发表于 2018-4-19 14:21:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
题目描述
国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天和第三天),每天收到两枚金币;之后三天(第四、五、六天),每天收到三枚金币;之后四天(第七、八、九、十天),每天收到四枚金币……;这种工资发放模式会一直这样延续下去:当连续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楼


回复

使用道具 举报

0

主题

3

帖子

18

积分

新手上路

Rank: 1

积分
18
推荐
发表于 2018-4-20 20:19:01 | 只看该作者
#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 不怕搞错?
回复 支持 1 反对 1

使用道具 举报

胡炜尧 该用户已被删除
推荐
发表于 2018-5-17 21:50:29 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 1 反对 0

使用道具 举报

738

主题

1485

帖子

5422

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5422
地板
 楼主| 发表于 2018-4-20 20:26:07 | 只看该作者
老师在这里用一个很直观的但是有点笨的方法,先将数字写到数组,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
回复 支持 反对

使用道具 举报

4

主题

21

帖子

89

积分

注册会员

Rank: 2

积分
89
5#
发表于 2018-4-20 20:26: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. }
复制代码
回复 支持 反对

使用道具 举报

9

主题

158

帖子

470

积分

华一学生

积分
470
QQ
6#
发表于 2018-4-21 19:40:57 | 只看该作者
  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行,累加过程。
回复 支持 反对

使用道具 举报

9

主题

89

帖子

292

积分

华一学生

积分
292
7#
发表于 2018-4-21 19:42:07 | 只看该作者
  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. }
复制代码
回复 支持 反对

使用道具 举报

9

主题

15

帖子

57

积分

注册会员

Rank: 2

积分
57
8#
发表于 2018-4-21 19:43:28 | 只看该作者
  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
回复 支持 反对

使用道具 举报

0

主题

17

帖子

82

积分

注册会员

Rank: 2

积分
82
9#
发表于 2018-4-21 19:49:17 | 只看该作者
  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. }
复制代码

回复 支持 反对

使用道具 举报

0

主题

3

帖子

44

积分

新手上路

Rank: 1

积分
44
10#
发表于 2018-4-21 20:44:38 | 只看该作者
  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. }
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-12-26 11:36 , Processed in 0.157694 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表