合肥市第 34 届青少年信息学(计算机)奥林匹克竞赛小学组试题

本文介绍了四个编程挑战题目,包括图书捐赠、最少花费、回文数和素数、体验积分值,涉及算法实现与数学应用,通过具体示例展示了如何解决这些问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、图书捐赠(books
一年过去了,卡卡西又积攒了不少的零用钱,非常有爱心的卡卡西计划将这
些零用钱购买一些图书,送给贫困山区的小朋友,他来到新华书店,看到一本非
常适合小朋友学习编程的图书,定价为 25 /本,如果购买数量超过 5 本,则购
买的所有图书价格降为 22 /本;而如果从网上购买,定价为 24 /本,如果购
买数量超过 10 本,则超过 10 本的部分 8 折优惠。卡卡西购买了 n 本该编程图书,
请你帮卡卡西计算下需要多少钱?
输入:输入数据一行,有两个用空格分隔的正整数 mn,其中 m=1 表示从新华
书店购买图书,m=2 表示从网上购买图书;n 表示总共购买图书的数量。
输出:一个数,表示购买图书需要花费的总金额,若 m=1,则输出为一个正整数,
m=2,则输出的数值精确到小数点后 2 位。
样例 1
输入:(books.in
1 6
输出:(books.out
132
样例 2
输入:(books.in
2 15
输出:(books.out
336.00
青少年信息学奥林匹克竞赛
小学组试题
数据范围:
1n100
#include<bits/stdc++.h>
using namespace std;
int main(){
	int m, n;
	double qian;
	cin>>m>>n;
	if(m==1){
		if(n<=5){
			qian=25*n;
		}else{
			qian=22*n;
		}
		cout<<qian<<endl;
	}else if(m==2){
		if(n<=10){
			qian=24*n;
		}else{
			qian=240+(n-10)*24*0.8;
		}
		printf("%.2f\n", qian);
	}
	return 0;
}

2、最少花费(cost)
卡卡西购买了一批图书后,非常的高兴,爸爸妈妈也表扬了他,称赞他把零
用钱用到了最需要使用的地方,但卡卡西发现如果再购买一些文具送给贫困山区
的小朋友们就更好了。第二天,卡卡西发动自己的小伙伴拿出他们的零用钱去购
买文具,文具以套为单位,按包装销售,每个包装中有数量不等的文具,而且价
格也不一样,卡卡西和小伙伴们只想购买一种包装的文具,商店不允许他们将包
装拆开,因此卡卡西有可能需要购买超过 n 套文具才行,在商店每种包装的数量
都足够的情况下,要买够至少 n 套文具最少需要花费多少钱。
输入:输入数据共 m+1 行。第一行有两个用空格分隔的正整数 mnm 表示包
装的数量,n 表示需要购买的套数。接下来的 m 行,每行有两个用空格分
隔的正整数 s1, s2,分别表示每一种包装中文具的数量和整包的价格。
输出:一个正整数,表示买够至少 n 套文具的最少花费。
样例:
输入:(cost.in
3 60
3 5
16 20
31 35
输出:(cost.out
70
样例说明:共 3 种包装,需要购买 60 套,如果选择 3 套装,需购买 20 个,总价
20*5=100,如果选择 16 套装,需购买 4 个,总价格 4*20=80,如果选择 31
套装,需购买 2 个,总价格 2*35=70
数据范围:
1m1000 1ns1s210000
#include<bits/stdc++.h>
using namespace std;
int main(){
	int ans=0x3f3f3f3f, qian;
	int m, n;
	int i, s1, s2;
	cin>>m>>n;//包装数量  购买套数
	for(i=1; i<=m; i++){
		cin>>s1>>s2;//数量、单价 
		 if(n%s1==0){
		 	qian=(n/s1)*s2; 
		 }else{
		 	qian=(n/s1+1)*s2;
		 } 
		 ans=min(qian, ans);//找最小值 
	} 
	cout<<ans<<endl; 
	return 0;
}

3、回文数和素数(amount)
青少年信息学奥林匹克竞赛
小学组试题
卡卡西和小朋友们把购买的图书和文具一起邮寄给了山区的贫困孩子,他们
做了一件极其有意义的事情,心理乐开了花;哼着歌儿他们做起了数字游戏,他
们发现有些自然数例如 1311221 等具有左右对称的特点,这样的数被称为回文
数;还有一些数如 1317 等只能被 1 和其自身整除,这样的数被称为素数。作
为编程的爱好者,卡卡西想写出一个程序,迅速求出两个数 m n 之间即是回
文数又是素数的个数。
输入:输入数据只有一行包含用空格分隔的两个正整数 m n
输出:一个整数,m n 之间(包含 m n)即是回文数又是素数的个数。
样例 1
输入:(amount.in
100 200
输出:(amount.out
5
数据范围:
100mn100000
#include<bits/stdc++.h>
using namespace std;
bool sushu(int n){
//大于等于2的素数判断 
	for(int i=2; i*i<=n; i++){
		if(n%i==0)
			return 0;
	}
	return 1;
}
bool huiwen(int m){
//回文数判断 
	int tmp=m, fan=0;
	while(m!=0){//生成反转数 
		fan=fan*10+m%10;
		m=m/10;
	}
	if(fan==tmp)
		return 1;
	else
		return 0;
}
int main(){
	int m, n;
	int i, ans=0;
	cin>>m>>n;
	for(i=m; i<=n; i++){
		if( huiwen(i) && sushu(i) )
			ans++; 
	}
	cout<<ans<<endl;
	return 0;
}

4、体验积分值(point)
卡卡西和小朋友们做完了烧脑的数字游戏,决定放松一下,他们来到了万达
乐园,乐园中有很多的游玩项目,每玩一个项目就能获取一定的体验积分,不同
的项目产生不同的体验积分,假设乐园所有的游乐项目正好排成一排,并且游客
们不能游玩任意相邻的两个项目,那么卡卡西如何挑选游玩项目,使得这次万达
行他能获得最多的体验积分值呢。
输入: 输入共两行,第一行是一个正整数 n,表示万达乐园的游乐项目数。第
二行是 n 个用空格隔开的正整数,分别表示每个游乐项目的体验积分值。
输出:只有一个正整数,为最多的体验积分值。
样例 1
输入:(point.in
5
3 10 8 20 21
输出:(point.out
32
样例说明:一共 5 个游玩项目,卡卡西选择第一个、第三个和第五个游玩,可共
青少年信息学奥林匹克竞赛
小学组试题
可获得 3+8+21=32 的体验积分值。
样例 2
输入:(point.in
5
3 17 8 20 21
输出:(point.out
38
样例说明:一共 5 个游玩项目,卡卡西选择第二个和第五个游玩,可共可获得
17+21=38 的体验积分值。
数据范围:
5n1000 1≤每个游玩项目体验积分值≤500
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值