首页 > 试题广场 >

[NOIP2015]金币

[编程题][NOIP2015]金币
  • 热度指数:12556 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天和第三天),每天收到两枚金币;之后三天(第四、五、六天),每天收到三枚金币;之后四天(第七、八、九、十天),每天收到四枚金币……;这种工资发放模式会一直这样延续下去:当连续N天每天收到N枚金币后,骑士会在之后的连续N+1天里,每天收到N+1枚金币。
请计算在前K天里,骑士一共获得了多少金币。

输入描述:
输入只有1行,包含一个正整数K,表示发放金币的天数。


输出描述:
输出只有1行,包含一个正整数,即骑士收到的金币数。
示例1

输入

6

输出

14

说明

骑士第一天收到一枚金币;第二天和第三天,每天收到两枚金币;第四、五、六天,每天收到三枚金币。因此一共收到1+2+2+3+3+3=14枚金币。
示例2

输入

1000

输出

29820

备注:
对于100%的数据,1 ≤ K ≤ 10,000。
#include<stdio.h>
int main()
{
    int K , coin = 0 , i = 1;
    scanf("%d",&K);
    while( K != 0 )
    {
        if( K >= i ) 
        {
            coin = coin + i * i;
            K = K - i;
            i++;
        }
        else 
        {
            coin = coin + K * i;
            break;
        }
    }
    printf("%d",coin);
    return 0;
}

发表于 2022-06-16 11:01:04 回复(1)
import java.util.*;
public class Main{
  public static int getcoin(int n) {
      int cion=0,num=0;
      for(int i=1;num<n;i++){
           for(int j=1;j<=i&&num<n;j++){
               cion+=i;
               num++;
            }
         }
    return cion;
  }
public static void main(String love[]){
   Scanner input=new Scanner(System.in);
   int n=input.nextInt();
    System.out.print(getcoin(n));
     input.close();
} 
}

发表于 2022-05-12 11:22:09 回复(0)
#include <stdio.h>
int main()
{
    int k,d,m=1;
    long long sum=0;
    scanf("%d",&k);
    for(d=1;d<=k;d++)
    {
        if(d>=(m*m-m)/2+1&&d<=(m*m+m)/2)
        {
            sum+=m;
        }
        else
        {
            m++;
            sum+=m;
        }
    }
    printf("%lld",sum);
    return 0;
}

发表于 2022-03-02 17:32:48 回复(0)
#include <iostream>
using namespace std;

int main()
{
    int k;
    scanf("%d", &k);
    int s = 0, d = 1;
    for (int i = 1; d <= k; i ++ )
    {
        for (int j = 1; j <= i; j ++ )
        {
            if (d > k) break;
            s += i;
            d ++ ;
        }
    }
    printf("%d", s);  
}

发表于 2022-02-27 14:28:04 回复(0)
a=int(input())
sum=0
k=1
while a>0:
    if a-k>=0:
        sum+=k*k
    else:
        sum+=k*(a)
    a=a-k
    k=k+1
print(sum)


发表于 2022-03-10 22:01:44 回复(2)
#include <iostream>
using namespace std;

int main()
{
    int date, sum = 0, count = 1, day = 1;
    cin >> date;
    for(int i = 1; i <= date; i++)
    {
        sum += day;
        if(i == count)
        {
            day ++;
            count += day;
        }
    }
    cout << sum;
    return 0;
}


发表于 2022-08-27 12:25:04 回复(0)
k = int(input())
n = 0
money = 0
for i in range(1,k+1):
    n += i
    money = i*i+money
    if n == k:
        break
    elif n > k:
        money = money-(n-k)*i
        break
print(money)  

发表于 2024-02-13 15:05:59 回复(0)
#include <stdio.h>

int main() {
    int n =0;
    scanf("%d", &n);
    int i = 0;
    int j = 0;
    int k = 0;
    int count = 0;
    for(i = 1; ; i++)
    {
        for(j = 1; j <= i; j++)
        {
            k += i;
            count++;
            if(count == n)
                break;
        }
        if(count == n)
                break;
    }
    printf("%d", k);
    return 0;
}
发表于 2023-04-08 15:41:00 回复(0)
#include <stdio.h>

int main() {
    int coin = 0;
    int day = 0;
    int i = 0;
    int K = 0;
    scanf("%d", &K);
    for (i = 1; day + i <= K;day += i,i++)
    {
        coin += i*i;
    }
    if (day != K&&day < K)
    {
        coin = coin + (K - day) * i;
    }
    printf("%d", coin);
    return 0;
}

发表于 2022-12-27 22:25:57 回复(0)
#include <stdio.h>
int main()
{
	long int day = 0, sum = 0;
    int count = 0,i = 0;
	scanf("%ld", &day);
	for (i = 1; i <= day; i++)
	{
		int j = 0;
		for (j = 0; j < i; j++)
		{
			sum += i;
			count++;
			if (day == count)
				break;
		}
		if (day == count)
			break;
	}
	printf("%ld", sum);
	return 0;
}

发表于 2022-11-20 16:44:44 回复(0)
#include<iostream>
using namespace std;
/*
类比数学问题:
    sum = 1*1 + 2*2 + 3*3 + ... + n*n (k>=n);
    sum = 1*1 + 2*2 + 3*3 + ... + k*n (k<n);
*/
int main() {
    int k,result=0;
    cin>>k;
    for(int i=1;k>0;i++)
    {
        if(k>=i) result+=i*i;
        else result+=i*k;
        k-=i;
    }
    cout<<result<<endl;
    return 0;
}


发表于 2022-09-27 23:07:45 回复(0)
#include<stdio.h>
/*
类比数学问题:
    sum = 1*1 + 2*2 + 3*3 + ... + n*n (k>=n);
    sum = 1*1 + 2*2 + 3*3 + ... + k*n (k<n);
*/
int main()
{
    int k;
    int i = 1;
    int result = 0;
    scanf("%d", &k);
    while(k>0)
    {
        if(k >= i)
            result += i*i;
        else
            result += k*i;
        k -= i;
        i++;  
    }
    printf("%d\n", result);
    return 0;
}

发表于 2022-03-07 19:00:54 回复(0)
第一轮持续1天,每天发放1金币,第二轮持续2天,每天发放2金币,第三轮持续3天每天发放3金币,以此类推。
思路:初始化当前轮次还剩1天,当天应收到的金币为1,每次循环代表一天,在循环中,使每天将当前轮次所剩天数-1,当前轮次所剩天数为0时,进入下一轮,此时当天应收金币数+1,然后新的一轮所剩天数跟此时应收金币数相同。每轮循环累加当天所收金币。
#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;
    int sum = 0;
    //gold表示当天应该收到的金币,date表示当前轮次还剩几天
    int gold = 1, date = 1;
    for (int i = 1; i < n + 1; i++) {
        //如果当前轮次结束,进入下一轮,此轮应该收到的金币+1,此轮的天数跟应收金币数相同
        if (date == 0) {
            gold++;
            date = gold;
        }
        //当前轮次所剩天数减一
        date--;
        //将当天收到的金币累加到总和
        sum = sum + gold;
    }
    cout << sum << endl;
}



发表于 2024-04-26 21:58:22 回复(0)
#include <stdio.h>

int main() {
    int a;
    scanf("%d",&a);
    int sum=0;
    int count=1;
    while (a) 
    {
        for (int i=0; i<count; i++) 
        {
            sum+=count;
            a--;
            if (a==0) 
            {
                printf("%d",sum);
                return 0;
            }
        }
        count++;
    }
    printf("%d",sum);
    return 0;
}

发表于 2024-04-25 16:42:18 回复(0)
#include <stdio.h>

int main() 
{
    int i = 0,n = 0,sum = 0,sum0 = 0;
    while(scanf("%d",&n) != EOF)
    {
        
        for (i = 1;i <= n; i++)
        {
            sum += i;
            sum0 += i * i;
            if (sum == n)
            {
                
                break;
            }
            else if(sum > n) 
            {
                int temp = n - (sum - i);//此行必须定义于此!!!
                sum0 -= i * i;          //我们不需要加上此时的i * i!
             
                sum0 += temp * i;//我们要加上的是temp * i!
                break;
            }
        }
        printf("%d",sum0);
    }
    
    return 0;
}

发表于 2024-03-31 14:42:49 回复(0)
#include <stdio.h>

int main() {
      int k=1,sum=0;
      scanf("%d",&k);
      int i=1;
      int count=0;
     while((k-count)>=i){
        sum+=i*i;
        count+=i;
        i++;
     }
      if(count!=k){
        sum+=i*(k-count);
      }
      printf("%d",sum);
}

编辑于 2024-03-26 23:24:25 回复(0)
#include <stdio.h>

int main() {
    int a = 0;
    scanf("%d",&a);
    int sum = 0;
    for(int i = 1; ; i++)
    {
        a -= i;
        sum += i*i;
        if(a < i+1)
        {
            sum += a*(i+1);
            break;
        }
    }
    printf("%d",sum);
    return 0;
}
编辑于 2024-02-15 22:11:40 回复(0)
#include <stdio.h>

int main() {
    int a;
    scanf("%d",&a);
    int sum=0;
    int i=1;
    int day=1;
    while(day<=a){
   
        for(int j=0;j<i;j++){
            sum+=i;
            day++;
            if(day>a){
                break;
            }
        }
        i++;
    }
    printf("%d",sum);
    return 0;
}
发表于 2024-02-07 16:49:14 回复(0)
数列(1个1, 2个2 , 3个3 ... ?个n),前n-1项统计为(n+1)*n/2个,第n项可能不足n
a = int(input())
sum=0
n = 1
while a - (n+1)*n/2 >= 0:
    sum = sum + n**2    
    n = n+1
res = (a - (n-1)*n/2)*n
print(int(sum+res))



编辑于 2024-02-04 10:48:10 回复(0)
#include <stdio.h>

int main() {
    int K, sum=0, n=1, tag=0;
    scanf("%d", &K);
    while(tag < K){
        for(int i=1; i<=n; i++){
            sum += n;
            tag++;
            if(tag >= K){
                break;
            }
            //printf("%d ", sum);
        }
        n++;
    }
    printf("%d", sum);
    return 0;
}
编辑于 2024-01-22 18:50:19 回复(0)