A题
请注意,这是一道编程题。
亲爱的选手们,
祝贺大家在网络赛中取得优异的成绩,晋级北京理工大学第十七届程序设计大赛决赛。在此,我谨代表竞赛裁判组,向各位同学们,表示热烈的欢迎和衷心的祝贺。
本次比赛由计算机学院与信创学院联合主办。信创学院是北京理工大学与中软国际携手打造的创新学院,得到了中软国际、深开鸿、华为等企业的鼎力支持。首届"开源鸿蒙英才班"在中关村校区举办开班典礼,标志着信创学院在开源鸿蒙领域的深度合作迈出了关键一步。学院致力于培养软件领域的新一代领军领导人才,强调"延安根、军工魂、领军人"的红色基因,致力于推进国家软件产业创新发展。这一合作旨在共同打造关键基础软件领域的"国之重器",引领中国在全球软件领域的崛起。开源鸿蒙(OpenHarmony)是由开放原子开源基金会(OpenAtom Foundation)孵化及运营的开源项目,目标是面向全场景、全连接、全智能时代、基于开源的方式,搭建一个智能终端设备操作系统的框架和平台,促进万物互联产业的繁荣发展。
现场赛的规则与网络赛有所不同,请仔细阅读以下注意事项:
- 请遵守赛场纪律,勿在⽐赛开始之前拆封试题袋、触碰⿏标或者键盘!⽐赛开始后,禁⽌使⽤⾃⼰的电⼦设备!比赛过程中,禁止与队友和工作人员以外的任何人以任何形式交流。
- 本次比赛采用ICPC赛制(也称为ACM赛制)。ICPC赛制以各个队伍的数量为第一关键字降序进⾏排序,当过题数量相同时,以罚时作为第二关键字升序进⾏排序,罚时的计算⽅式是:已通过的题⽬的AC的时间的总和+这些题⽬提交前错误的次数(不含编译错误)*20分钟。
- 本次比赛允许的竞赛语言包括:C, C++, Java, Python。
- 本次比赛不允许与除比赛服务器等完成比赛必要的计算机以外的任何计算机进行任何形式的网络通信,但可以查阅本队在赛前准备的任何纸质材料。
- 本次比赛的题目不按难度顺序排序,当遇到不会做的题目时,请继续阅读下一道题目。
- 如果对题目有疑问,应当通过比赛系统的"clarification"功能向裁判组提出。
为了确保各位同学都已经阅读并理解上述内容,请大家完成以下 10 10 10 道单选题:
1. 以下行为中,被禁止的不包括( )
A. 在比赛开始前,和队友打情骂俏
B. 在比赛开始前,拆封试题袋
C. 在比赛开始前,操作比赛用机
D. 在比赛开始后,使用自己携带的计算器
2. 作为参赛选手,你可以在比赛中( )
A. 使用手机玩原神
B. 用言语嘲讽其他队伍的队员
C. 查阅提前书写在餐巾纸中的小抄
D. 使用SSH登录其他队伍的比赛机器
3. 本次比赛的赛制是( )
A. ICPC赛制
B. LeetCode赛制
C. IOI赛制
D. 乐学赛制
4. 在ICPC赛制中,下列四个选项中,成绩排名第一的是( )
A. 通过 1 1 1 题,罚时 114514 114514 114514 分钟
B. 通过 1 1 1 题,罚时 1919810 1919810 1919810 分钟
C. 通过 13 13 13 题,罚时 114514 114514 114514 分钟
D. 通过 13 13 13 题,罚时 1919810 1919810 1919810 分钟
5. 以下是某个参赛队的比赛记录,在ICPC赛制中,该队此时的罚时是( )分钟
提交时间(分钟) | 题目编号 | 结果 |
---|---|---|
10 | B | WRONG-ANSWER |
20 | A | CORRECT |
30 | B | COMPILER-ERROR |
40 | B | CORRECT |
50 | B | WRONG-ANSWER |
60 | C | CORRECT |
A. 140
B. 160
C. 180
D. 210
6. 在本次比赛中,不能使用以下哪种语言( )
A. C
B. C++
C. JavaScript
D. Python
7. 当你对题目有疑问时,可以( )
A. 使用比赛系统的"clarification"功能向裁判组提出
B. 询问旁边队伍的参赛选手
C. 在赛场大声问候出题人
D. 躺在赛场的地板上,大声哭闹以吸引出题人的注意
8. 在比赛中,当你不会做某道题目时,你可以( )
A. 询问附近的队伍该题的解法
B. 询问ChatGPT该题的解法
C. 放弃求解该题目,尝试解出其他题目
D. 通过"clarification"功能向裁判询问该题的解法
9. 本次比赛由计算机学院与( )联合主办
A. 信创学院
B. 原神学院
C. 魏公村职业汽修学院
D. 电竞学院
10. "鸿蒙"的英文名为( )
A. Harmini
B. Howmoney
C. Harmony
D. Homony
解题思路:
根据题干,对每题解答
AC代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
cout<<"A"<<endl;
cout<<"C"<<endl;
cout<<"A"<<endl;
cout<<"C"<<endl;
cout<<"A"<<endl;
cout<<"C"<<endl;
cout<<"A"<<endl;
cout<<"C"<<endl;
cout<<"A"<<endl;
cout<<"C";
return 0;
}
B题
小 P \text{P} P 在合肥玩了一天,晚上回到酒店后决定开一把钢铁雄心 4 4 4。钢铁雄心 4 4 4是一款二战模拟器,玩家可以操纵部队进攻敌国。玩了没多久,小 P \text{P} P 很快便包围了敌军的部队。
具体来说,当前这一片战场可以看成是一块 n × m n\times m n×m 的网格,每个格子上有一个数字,第 i i i 行第 j j j 列的数字为 a i , j a_{i,j} ai,j。如果 KaTeX parse error: Expected 'EOF', got '&' at position 8: a_{i,j}&̲gt;0,则代表这块格子上有数量为 a i , j a_{i,j} ai,j 的敌军部队,如果 a i , j = 0 a_{i,j}=0 ai,j=0,则代表这块格子上是我军部队。在这片战场之外也全是我军部队。
显然,这些敌军部队深陷我军的包围之中,我们需要快速消灭包围圈中的敌人。我们每次可以选择一块与我军部队相邻的有敌军的格子(假设是第 i i i 行第 j j j 列),然后一共需要消耗 a i , j a_{i,j} ai,j 加上这个格子四周的敌军部队数量之和个单位的装备消灭掉这个格子上的敌人,随后我军部队进入这个格子, a i , j a_{i,j} ai,j 变为 0 0 0。
由于战场宽度的限制,导致每个格子最多只有一个敌军部队,即 a i , j ∈ { 0 , 1 } a_{i,j}\in\{0,1\} ai,j∈{0,1}。现在小 P \text{P} P 想要知道,最少消耗多少装备能够消灭掉所有敌军部队?
解题思路:
找规律。规律是没有消除的先后顺序。
AC代码:
#include<bits/stdc++.h>
using namespace std;
int mp[1010][1010],w[1010][1010];
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int tj(int x,int y)
{
int a=1;
for(int i=0;i<4;i++)
{
a+=mp[x+dx[i]][y+dy[i]];
}
return a;
}
int main()
{
int n,m,x;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>mp[i][j];
}
}
int ans=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(mp[i][j]==1)
{
ans+=tj(i,j);
mp[i][j]=0;
}
}
}
cout<<ans;
return 0;
}
J题
smzzl 驾驶着小车正在环海公路漫游,突然遇到了一个很窄的地方,还好他技术高超,他打算使用 b 站刚看到的单边桥方法通过这段路(你别管怎么上的墙)。由于 smzzl 喜欢漂移,又要防止漂到海里去,他想要驾驶底盘低的车,请你告诉他,在不挂蹭到车底盘的前提下,他最低能驾驶底盘多低的车通过这段路。
由于车是 smzzl 自己改装的,因此 smzzl 将几乎所有的重量都分配在了车的接地处以防翻车。
【高手在民间单边桥极限会车】 https://www.bilibili.com/video/BV1AV4y1q7KP
在本题中,道路被抽象成如下图所示:左侧蓝色粗线的是海洋,中间黑色的是路面,右侧蓝色细线是墙壁(竖的是墙壁侧面,横着的是墙壁顶面);红色的是车轮,绿色的是底盘,紫色的是车身。车辆允许两个轮胎都在路面上,或者一个轮胎在路面上另一个在墙壁的顶面上。车辆需要满足除了轮胎最下面的接地处,其他地方均不能和墙壁有交,恰好碰到也认为是有交(显然车不能穿模,这可是真实车辆!)。
模型示意图
在本题中,车轮的大小也就代表的底盘高度,也就是图中的参数 c c c。
给定车和道路的参数,请你告诉 smzzl 最低允许驾驶的车辆底盘高度。路面和车辆参数具体见题目输入部分。
解题思路:
注意变量均为浮点数类型
AC代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
for(int z=0;z<t;z++)
{
double ans,a,b,h,w;
cin>>a>>b>>h>>w;
if(a>w){
ans=0;
printf("%llf\n",ans);
}
else
{
if(b>=w) cout<<"-1"<<endl;
else
{
double l=sqrt(w*w-b*b)-a;
if(l<=0){
ans=0;
printf("%llf\n",ans);
}
else
{
ans=l*b/w;
printf("%llf\n",ans);
}
}
}
}
return 0;
}
K题
str,一个充满着神秘气息的字符串。
它既可以是某位 jiker 的姓名缩写,也可以表示字符串这个单词的缩写,由于其多变的特性,我们可以定义str进制字符串,下面的符合下面进位规则的进制称为该字符串下的 str 进制:
给出一个str进制字符串,每位上的数字 x x x表示该位上是逢 x x x进 1 1 1。
给定某个字符串 s s s,再给出一个十进制下的整数 d d d,求 d d d在str进制下的表示值。
Input
第一行输入两个整数 m , n m,n m,n ( 1 ≤ m ≤ 1000 , 1 ≤ n ≤ 10 1 \le m \le 1000 , 1 \le n \le 10 1≤m≤1000,1≤n≤10),代表 str 进制字符串的长度和 d d d的位数。
第二行输入一个字符串 s s s ( 2 ≤ s i ≤ 9 2 \le s_i \le 9 2≤si≤9),表示 str 字符串。
第三行输入一个整数,表示 d d d ( 0 ≤ d ≤ 1 0 10 0 \le d \le 10^{10} 0≤d≤1010)。
数据保证 d d d能够在str进制下被表示出来。
Output
输出一行一个 m m m 位的整数,为整数 d d d在 str 进制下的表示。(包括前导零)
解题思路:
利用好string的翻转函数
AC代码
#include<bits/stdc++.h>
using namespace std;
string ans,s;
long long t=-1,d,m,n,z=-1;
int main()
{
cin>>m>>n>>s>>d;
reverse(s.begin(),s.end());
while(d>0)
{
z++;
ans+=(d%(s[z]-'0'))+'0';
d/=(s[z]-'0');
}
reverse(ans.begin(),ans.end());
int tt=m-ans.size();
for(int i=0;i<tt;i++)
cout<<"0";
cout<<ans;
return 0;
}
M题
小H很喜欢吃糖。
有一天,小L给小H准备了一大串糖果,它们从前往后排成一行,每个糖果上都写有一个小写字母。由于单纯的吃糖显得太单调,于是小L制定了一个规则,小H只能选择一个糖果,然后依次吃掉它和它后面的所有糖果。吃掉的这串糖果的组成的字符串字典序越大,小H的满意度就越高。然而小H可不会这么轻易地就同意小L的规则,于是据理力争来了一个条件:可以任意选择恰好一个位置,将上面的糖果替换为写有任意一个小写字母的糖果(允许替换前后的糖果上的字母相同)。
现在,聪明的你告诉小H,该如何替换糖果以及选择起始位置的糖果,得以让小H的满意度最高呢?
对于两个字符串 s 1 s_1 s1 和 s 2 s_2 s2,它们的长度分别为 n 1 n_1 n1 和 n 2 n_2 n2。定义 s 1 s_1 s1 的字典序比 s 2 s_2 s2 的小,当且仅当其满足以下两个条件之一:
- 如果存在一个位置 i i i,使得对于所有 KaTeX parse error: Expected 'EOF', got '&' at position 3: j &̲lt; i, s 1 , j = s 2 , j s_{1,j} = s_{2,j} s1,j=s2,j,而 KaTeX parse error: Expected 'EOF', got '&' at position 9: s_{1,i} &̲lt; s_{2,i}。即在第一个不相等的位置上, s 1 s_1 s1 的字母在字母表中的顺序靠前。
- 如果 s 1 s_1 s1 是 s 2 s_2 s2 的前缀,且 KaTeX parse error: Expected 'EOF', got '&' at position 5: n_1 &̲lt; n_2。
Input
第一行输入一个 n n n ( 1 ≤ n ≤ 5000 1 \le n \le 5000 1≤n≤5000) ,代表糖果的个数。
第二行输入一个字符串 s s s ( ∣ s ∣ = n |s|=n ∣s∣=n) ,代表糖果上字母的序列。
题目保证 s s s 只包含小写字母。
Output
输出共一行一个字符串,表示让小H满意度最大的糖果串。
解题思路:
string字符串的比与题意的比较相同。
AC代码
#include<bits/stdc++.h>
using namespace std;
string s,a,ma;
int main()
{
int n;
cin>>n>>s;
for(int i=0;i<n;i++)
{
a.clear();
for(int j=i;j<n;j++) a+=s[j];
for(int j=0;j<a.size();j++)
{
if(a[j]!='z')
{
a[j]='z';
break;
}
}
if(ma.compare(a)<0) ma=a;
}
cout<<ma;
return 0;
}