青少年软件编程(C 语言) 等级考试试卷(七级)
分数: 100 题数: 4
一、 编程题(共 4 题, 共 100 分)
1. 城堡问题
1 2 3 4 5 6 7
#############################
1 # | # | # | | #
#####---#####---#---#####---#
2 # # | # # # # #
#---#####---#####---#####---#
3 # | | # # # # #
#---#########---#####---#---#
4 # # | | | | # #
#############################
(图 1)
# = Wall
| = No wall
- = No wall
图 1 是一个城堡的地形图。 请你编写一个程序, 计算城堡一共有多少房间, 最大的房间
有多大。 城堡被分割成 m×n(m≤50, n≤50)个方块, 每个方块可以有 0~4 面墙。
输入
程序从标准输入设备读入数据。 第 1 、 2 行每行 1 个整数, 分别是南北向、 东西向的方
块数。 在接下来的输入行里, 每个方块用一个数字(0≤p≤50)描述。 用一个数字表示方块
周围的墙, 1 表示西墙, 2 表示北墙, 4 表示东墙, 8 表示南墙。 每个方块用代表其周围
墙的数字之和表示。 城堡的内墙被计算两次, 方块(1 ,1 )的南墙同时也是方块(2,1 )的北墙。
输入的数据保证城堡至少有两个房间。
输出
输出 2 行, 每行一个数, 表示城堡的房间数、 城堡中最大房间所包括的方块数。 结果显
示在标准输出设备上。
样例输入
4
7
11 6 11 6 3 10 6
7 9 6 13 5 15 5
1 10 12 7 13 7 5
13 11 10 8 10 12 13
样例输出
5
9
2. priority queue 练习题
我们定义一个正整数 a 比正整数 b 优先的含义是:
*a 的质因数数目 (不包括自 身) 比 b 的质因数数目 多;
*当两者质因数数目 相等时, 数值较大者优先级高。
现在给定一个容器, 初始元素数目 为 0, 之后每次往里面添加 1 0 个元素, 每次添加之
后, 要求输出优先级最高与最低的元素, 并把该两元素从容器中删除。
输入
第一行: num (添加元素次数, num <= 30)
下面 1 0*num 行, 每行一个正整数 n(n < 1 0000000).
输出
每次输入 1 0 个整数后, 输出容器中优先级最高与最低的元素, 两者用空格间隔。
样例输入
1
10 7 66 4 5 30 91 100 8 9
样例输出
66 5
试题编号: 20230520-7-02
试题类型: 编程题
标准答案:
试题难度: 一般
试题解析:
#include<bits/stdc++.h>
using namespace std;
int num,d[35][15],pri[500010],tot[500010],a[500010];
int DECOMPOSITION(int x){
int cnt=0,Cnt=0;
for(int i=2;i<=x/i;i++){
for(;x%i==0;x/=i){
a[++cnt]=i;
}
}
if(x>1)a[++cnt]=x;
for(int i=1;i<=cnt;i++,tot[Cnt]++){
if(a[i]!=a[i-1])pri[++Cnt]=a[i];
}
return Cnt;
}
bool isprime(int n){
for(int i=2;i*i<=n;i++){
if(n%i==0){
return 0;
}
}
return 1;
}
struct node{
int tmp;
int cs;
bool operator<(const node &b)const{
if(cs!=b.cs)return cs<b.cs;
else return tmp<b.tmp;
}
};
struct node1{
int tmp;
int cs;
bool operator<(const node1 &b)const{
if(cs!=b.cs)return cs>b.cs;
else return tmp>b.tmp;
}
};
priority_queue<node>q1;
priority_queue<node1>q2;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>num;
for(int i=1;i<=num;i++){
for(int j=1;j<=10;j++){
cin>>d[i][j];
int cyt=DECOMPOSITION(d[i][j]);
if(d[i][j]==1||d[i][j]==0||isprime(d[i][j]))cyt=0;
node top1 ;;
node1 top2;
top1.tmp=d[i][j];
top1.cs=cyt;
top2.tmp=d[i][j];
top2.cs=cyt;
q1.push(top1);
q2.push(top2);
}
cout<<q1.top().tmp<<" "<<q2.top().tmp<<endl;
q1.pop();q2.pop();
}
return 0;
}
更多内容请查看网站:
青少年软件编程历年真题模拟题实时更新