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 q;

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

博学佑航-青少年考级竞赛题库

本文标签: 糖果圣诞老人重量