admin管理员组文章数量:1530845
2024年6月29日发(作者:)
青少年软件编程(C语言五级)等级考试真题试卷(2021年6月)
题目总数:4 总分数:100 时间:不限时
第 1 题 问答题
数字变换
给定一个包含5个数字(0-9)的字符串,例如 “02943”,请将“12345”变换到它。 你可以采取3种操作进行变
换
1. 交换相邻的两个数字
2. 将一个数字加1。如果加1后大于9,则变为0
3. 将一个数字加倍。如果加倍后大于9,则将其变为加倍后的结果除以10的余数。
最多只能用第2种操作3次,第3种操作2次 求最少经过多少次操作可以完成变换。
时间限制:1000
内存限制:65536
输入
有最多 100,000 组数据 每组数据就是包含5个数字的字符串
输出
对每组数据,输出将12345变换到给定字符串所需要的最少操作步数。如果无法变换成功,输出-1
样例输入
12435
99999
12374
样例输出
1
-1
3
提示
由于测试数据太多,如果对每组数据都从头进行搜索,就会超时。 建议先做预处理,即以“12345”作为初始状
态做一遍彻底的广搜,找出“12345”经合法变换能够到达的所有字符串,并记录到达这些字符串各需要多少步
操作。 然后对读入的每组数据,在上述预处理记录的结果中进行查询即可。
答案
#include
#include
#include
#include
博学佑航-青少年考级竞赛题库
using namespace std;
#define _init(x, v) memset(x, v, sizeof(x))
int rcd[100000];
bool vis[100000][5][5];
struct node{
int a[5], d, o2, o3;
};
queue
void in(){
_init(rcd, -1);
node s = {1,2,3,4,5,0,3,2};
(s);
vis[12345][3][2] = 1;
rcd[12345] = 0;
}
int toNum(node& n){
int t = 0;
for(int i= 0; i < 5; ++i){
t *= 10;
t += n.a[i];
}
return t;
}
void bfs(){
while(!()){
node s = ();
int t = toNum(s);
if(rcd[t] == -1 || rcd[t] > s.d) rcd[t] = s.d;
// printf("n = %d, d = %d, o2 = %d, o3 = %dn", toNum(s), s.d, s.o2, s.o3);
++s.d;
();
for(int i = 0; i < 5; ++i){
// o1
if(i < 4 && s.a[i] != s.a[i+1]){
swap(s.a[i], s.a[i+1]);
if(!vis[toNum(s)][s.o2][s.o3]){
vis[toNum(s)][s.o2][s.o3] = 1;
(s);
博学佑航-青少年考级竞赛题库
}
第 2 题 问答题
圣诞老人的礼物
圣诞节来临了,在城市A中圣诞老人准备分发糖果,现在有多箱不同的糖果,每箱糖果有自己的价值和重量,
每箱糖果都可以拆分成任意散装组合带走。圣诞老人的驯鹿最多只能承受一定重量的糖果,请问圣诞老人最多
能带走多大价值的糖果。
时间限制:1000
内存限制:65536
输入
第一行由两个部分组成,分别为糖果箱数正整数n(1 = n = 100),驯鹿能承受的最大重量正整数w(0 w
10000),两个数用空格隔开。其余n行每行对应一箱糖果,由两部分组成,分别为一箱糖果的价值正整数v和
重量正整数w,中间用空格隔开。
输出
输出圣诞老人能带走的糖果的最大总价值,保留1位小数。输出为一行,以换行符结束。
样例输入
4 15
100 4
412 8
266 7
591 2
样例输出
1193.0
答案
#include
#include
#include
#include
using namespace std;
struct gift{
int value;
int weight;
double density;
}gf[101];
bool cmp(gift f1,gift f2){ //按照单重价值从大到小排序
}
int main(){
int n,w;
cin>>n>>w;
for(int i=0;i return y > y; 博学佑航-青少年考级竞赛题库 } } cin>>gf[i].value>>gf[i].weight; gf[i].density=1.0*gf[i].value/gf[i].weight; sort(gf,gf+n,cmp); double totw=0,totv =0; //注意到w为int型,可拆分为double型 //所以新建一个double型保存背包剩余重量 for(int i=0;i } if(totw + gf[i].weight<=w){ } totw+=gf[i].weight; totv+=gf[i].value; totv+=gf[i].density *(w-totw); totw = w; break; }else{ printf("%.1lf",totv); return 0; 第 3 题 问答题 忍者道具 忍者道具有很多种,苦无,飞镖,震爆弹。L君热衷于收集忍者道具,现在他有N个道具,每个道具的重量分别 是C1、C2…CN。现在他想把这N个道具装到载重量为W的工具包里,请问他最少需要多少个工具包? 时间限制:1000 内存限制:65536 输入 第一行包含两个用空格隔开的整数,N和W。 接下来N行每行一个整数,其中第i+1行的整数表示第i个道具的重 量Ci。 输出 输出一个整数,最少需要多少个工具包。 样例输入 5 1996 1 2 1994 12 29 样例输出 2 博学佑航-青少年考级竞赛题库
版权声明:本文标题:青少年软件编程(C语言五级)等级考试真题试卷(2021年6月)-附答案 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dianzi/1719667207a790450.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论