历年NOIP/CSPJ第一题题解

【15NOIP普及组】金币:

题目描述:

国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天和第三天),每天收到两枚金币;之后三天(第四、五、六天),每天收到三枚金币;之后四天(第七、八、九、十天),每天收到四枚金币……;这种工资发放模式会一直这样延续下去:当连续N天每天收到N枚金币后,骑士会在之后的连续N+1天里,每天收到N+1枚金币。

请计算在前K天里,骑士一共获得了多少金币。

输入

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

输出

只有1行,包含一个正整数,即骑士收到的金币数。

输入样例

6

输出样例

14

AC代码

#include<bits/stdc++.h>
using namespace std;

int main()
{
  int cnt=0,n,t=0;
  cin>>n;
  for(int i=1;i<=n;i++){
  	for(int j=1;j<=i;j++){
  		cnt+=i;
  		t++;
  		if(t==n){
  			cout<<cnt<<endl;
  			return 0;
  		}
  	}
  }
  return 0;
}

【16NOIP普及组】买铅笔:

题目描述

P老师需要去商店买n支铅笔作为小朋友们参加NOIP的礼物。她发现商店一共有3种包装的铅笔,不同包装内的铅笔数量有可能不同,价格也有可能不同。为了公平起见,P老师决定只买同一种包装的铅笔。商店不允许将铅笔的包装拆开,因此P老师可能需要购买超过n支铅笔才够给小朋友们发礼物。现在P老师想知道,在商店每种包装的数量都足够的情况下,要买够至少n支铅笔最少需要花费多少钱。

输入

输入的第一行包含一个正整数n,表示需要的铅笔数量。

接下来三行,每行用两个正整数描述一种包装的铅笔:其中第一个整数表示这种包装内铅笔的数量,第二个整数表示这种包装的价格。

保证所有的7个数都是不超过10000的正整数。

输出

输出一行一个整数,表示P老师最少需要花费的钱。

输入样例

57
2 2
50 30
30 27

输出样例

54

AC代码

#include <stdio.h>
#include <math.h>

int main()
{
  int n;
  int x, y;
  double p, min;
  scanf("%d", &n);
  for (int i = 0; i < 3; ++i)
  {
    scanf("%d %d", &x, &y);
    p = ceil((n*1.0 / x)) * y;
    if (i == 0)
    {
      min = p;
    }
    if (p < min)
    {
      min = p;
    }
  }
  printf("%.0lf\n",min);
  return 0;
}

摘自

Junglei-Rim

的客博

【17NOIP普及组】成绩:

题目描述

牛牛最近学习了 C++入门课程,这门课程的总成绩计算方法是:

总成绩 = 作业成绩 × 20% + 小测成绩 × 30% + 期末考试成绩 × 50%

牛牛想知道,这门课程自己最终能得到多少分。

输入

只有 1 行,包含三个非负整数A、B、C,分别表示牛牛的作业成绩、小测 成绩和期末考试成绩。相邻两个数之间用一个空格隔开,三项成绩满分都是 100 分。

输出

只有 1 行,包含一个整数,即牛牛这门课程的总成绩,满分也是 100 分。

输入样例

100 100 80

输出样例

90

AC代码

#include<iostream>
using namespace std;
int main()
{
    int A, B, C;
    cin >> A >> B >> C;
    cout << A * 0.2 + B * 0.3 + C * 0.5;
    return 0;
}

【18NOIP普及组】标题统计:

题目描述

凯凯刚写了一篇美妙的作文,请问这篇作文的标题中有多少个字符?

注意:标题中可能包含大、小写英文字母、数字字符、空格和换行符。统计标题字符数时,空格和换行符不计算在内。

输入

输入只有一行,一个字符串 s�。

输出

输出只有一行,包含一个整数,即作文标题的字符数(不含空格和换行符)。

输入样例

234

输出样例

3

AC代码

 #include <bits/stdc++.h>
using namespace std;
int cnt;
int main()
{
    string s;
    getline(cin,s);
    for(int i=0;i<s.size();i++){
        if(s[i]==' '){
            continue;
        }
        cnt++;
    }
    cout<<cnt;
    return 0;
}

【19CSPJ普及组】数字游戏:

题目描述

小 K 同学向小 P 同学发送了一个长度为 8 的 01 字符串来玩数字游戏,小 P 同学想要知道字符串中究竟有多少个 1。

注意:01 字符串为每一个字符是 0 或者 1 的字符串,如“101”(不含双引号)为一个长度为 3 的 01 字符串。

输入

只有一行,一个长度为 8 的 01 字符串 s。

输出

只有一行,包含一个整数,即 01 字符串中字符 1 的个数。

输入样例

00010100

输出样例

2

AC代码

#include <bits/stdc++.h>
using namespace std;
int cnt;
int main()
{
  string s;
  cin>>s;
  for(int i=0;i<s.size();i++){
  	if(s[i]=='1'){
  		cnt++;
  	}
  }
  cout<<cnt;
  return 0;
}

【20CSPJ普及组】优秀的拆分:

题目描述

一般来说,一个正整数可以拆分成若干个正整数的和。

例如,1=11=1,10=1+2+3+410=1+2+3+4 等。对于正整数 n的一种特定拆分,我们称它为“优秀的”,当且仅当在这种拆分下,n 被分解为了若干个不同的 22 的正整数次幂。注意,一个数 x能被表示成 22 的正整数次幂,当且仅当 x 能通过正整数个 22 相乘在一起得到。

例如,10=8+2=23+2110=8+2=23+21是一个优秀的拆分。但是,7=4+2+1=22+21+207=4+2+1=22+21+20 就不是一个优秀的拆分,因为 11 不是 22 的正整数次幂。

现在,给定正整数 n,你需要判断这个数的所有拆分中,是否存在优秀的拆分。若存在,请你给出具体的拆分方案。

输入

输入只有一行,一个整数 nn,代表需要判断的数。

输出

如果这个数的所有拆分中,存在优秀的拆分。那么,你需要从大到小输出这个拆分中的每一个数,相邻两个数之间用一个空格隔开。可以证明,在规定了拆分数字的顺序后,该拆分方案是唯一的。

若不存在优秀的拆分,输出 -1

输入样例

6

输出样例

4 2

AC代码

#include <bits/stdc++.h>
using namespace std;
int n,a[30],j,k;
int main(){
	cin>>n;
	if(n%2==1)cout<<-1;
	else{
		for(int i=n;i!=0;i/=2){
			j++;
			a[j]=i%2;
		}
		k=j-1;
		for(int i=j;i>=1;i--){
			long long s=pow(2,k);
			if(a[i]!=0)cout<<s<<" ";
			k--;
		}
	}
    return 0;
}

【21CSPJ普及组】分糖果(candy):

题目描述

红太阳幼儿园的小朋友们开始分糖果啦!

红太阳幼儿园有 n 个小朋友,你是其中之一。保证 n≥2≥2。

有一天你在幼儿园的后花园里发现无穷多颗糖果,你打算拿一些糖果回去分给幼儿园的小朋友们。

由于你只是个平平无奇的幼儿园小朋友,所以你的体力有限,至多只能拿 R 块糖回去。

但是拿的太少不够分的,所以你至少要拿 L 块糖回去。保证 n≤L≤R。

也就是说,如果你拿了 k 块糖,那么你需要保证 L≤k≤R。

如果你拿了 k 块糖,你将把这 k块糖放到篮子里,并要求大家按照如下方案分糖果:只要篮子里有不少于n块糖果,幼儿园的所有 n 个小朋友(包括你自己)都从篮子中拿走恰好一块糖,直到篮子里的糖数量少于

n块。此时篮子里剩余的糖果均归你所有——这些糖果是作为你 搬糖果的奖励。

作为幼儿园高质量小朋友,你希望让作为你搬糖果的奖励的糖果数量(而不是你最后获得的总糖果数量!)尽可能多;因此你需要写一个程序,依次输入 n, L, R,并输出

出你最多能获得多少作为你搬糖果的奖励的糖果数量。

输入

输入一行,包含三个正整数 n, L, R,分别表示小朋友的个数、糖果数量的下界和上界。

输出

输出一行一个整数,表示你最多能获得的作为你搬糖果的奖励的糖果数量。

输入样例

7 16 23

输出样例

6

AC代码

#include <bits/stdc++.h>
using namespace std;

int main()
{
  int n,l,r;
  cin>>n>>l>>r;
  if(l/n==r/n){
  	cout<<r%n;
  }
  else{
  	cout<<n-1;
  }
  return 0;
}

【22CSPJ普及组】乘方(pow):

【题目描述】

小文同学刚刚接触了信息学竞赛,有一天她遇到了这样一个题:给定正整数 a 和 b,求 ab 的值是多少。

a^b即 b个 a 相乘的值,例如 2^3 即为 3个 2 相乘,结果为 2×2×2=8。

“简单!”小文心想,同时很快就写出了一份程序,可是测试时却出现了错误。

小文很快意识到,她的程序里的变量都是 int 类型的。在大多数机器上,int 类型能表示的最大数为 231−1 ,因此只要计算结果超过这个数,她的程序就会出现错误。

由于小文刚刚学会编程,她担心使用 int 计算会出现问题。因此她希望你在 ab 的值超过 109 时,输出一个 ‐1 进行警示,否则就输出正确的 a^b的值。

然而小文还是不知道怎么实现这份程序,因此她想请你帮忙。

输入

输入共一行,两个正整数 a, b。

输出

输出共一行,如果 ab 的值不超过 109 ,则输出 a^b 的值,否则输出 ‐1 。

输入样例

10 9

输出样例

1000000000

AC代码

#include <bits/stdc++.h>
using namespace std;
long long a,b,sum=1;
int main()
{
	scanf("%d%d",&a,&b);
	for(int i=1;i<=b;i++)
	{
		sum=sum*a;
		if(sum>1000000000)
		{
			printf("-1");
			return 0;
		}
	}
	printf("%d",sum);
	return 0;
}

求赞!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值