日期:2023年10月4日星期三
学号:S14029
姓名:黄子航
1. 比赛概况:
比赛总分共 4 题,满分 400,赛时拿到100 分,其中第一题 100 分,第二题 0 分,第三题 0 分,第四题 0 分。
2. 比赛过程:
比赛时按照顺序做的,第一题搞了很久,最后总算AC了,第二题输出错了,第三题和第四题完全没有思路,只好交了白卷。(要不是我没学我早就做完了)
3. 题解报告:
(1) 第一题:复读机
情况:赛中100分。
题意:一个长度为n的只包含数字和小写字母的字符串,字母为复读的内容,数字为复读的次数,数据字符串,请输出结果。
赛时本题做题想法:模拟法。
题解:模拟法。
AC 代码:
#include<bits/stdc++.h>
using namespace std;
char st[500100];
int top=-1;
int main(){
freopen("repeater.in","r",stdin);
freopen("repeater.out","w",stdout);
int n,t;
string s;
cin>>t;
while(t--){
cin>>n>>s;
string r="\0",g="\0";
for(int j=0;j<n;j++){
int x=0,f=0;
st[++top]=s[j];
while(s[j+1]>='0'&&s[j+1]<='9'){
st[++top]=s[++j];
x=x*10+st[top]-'0';
f++;
}
r+=st[top-f];
g=r;
for(int q=1;q<x;q++){
r+=g;
}
}
cout<<r<<endl;
}
fclose(stdin);
fclose(stdout);
return 0;
}
(2) 第二题:小可的矛与盾
情况:赛中0分,已补题。
题意:一群战士站成一排,编号为1到n,每个战士的战斗力都为自己的编号,有人拿矛,有人拿盾,请问拿矛的的战斗力和拿盾的防御力香肠为多少?
赛时本题做题想法:枚举+优化,但是输出错变量了。
题解:简简单单的枚举法,然后优化。
AC 代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
freopen("spearshield.in","r",stdin);
freopen("spearshield.out","w",stdout);
int n;
string s;
cin>>n>>s;
s=" "+s;
vector<long long>pre1(n+5,0),pre0(n+5,0);
for(int i=1;i<=n;i++){
pre1[i]=pre1[i-1]+(s[i]=='1')*i;
pre0[i]=pre0[i-1]+(s[i]=='0')*i;
}
long long ans =1e9;
for(int i=1;i<=n;i++){
ans=min(ans,abs(pre0[i-1]-(pre1[n]-pre1[i-1])));
}
cout<<ans;
fclose(stdin);
fclose(stdout);
return 0;
}
(3) 第三题:不合法字符串
情况:赛中0分,已补题。
题意:编写一个程序,将小说中的字符串中不和谐的字符替换为‘*’号。
赛时本题做题想法:暴力枚举法,但是写了一半就想不出来了。
题解:本题不涉及到太多算法,只需将字符串倒着遍历,然后替换不和谐的字母即可。
AC 代码:
#include<bits/stdc++.h>
using namespace std;
int T,n,m;
string str[100000],tgt;
int main(){
//freopen("illegality.in","r",stdin);
//freopen("illegality.out","w",stdout);
cin>>T;
while(T--){
cin>>m;
for(int i=1;i<=m;i++)
cin>>str[i];
cin>>tgt;
n=tgt.length();
tgt=' '+tgt;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(i<str[j].length()) continue;
if(tgt.substr(i-str[j].length()+1,str[j].length())==str[j]){
tgt[i]='*';
}
}
}
for(int i=1;i<=n;i++)
cout<<tgt[i];
cout<<endl;
}
//fclose(stdin);
//fclose(stdout);
return 0;
}
(4) 第四题:虚假的珂朵莉树
情况:赛中0分。
题意:一棵树有 n 个节点,根节点为 1, 每个节点与根节点距离是这个节点的深度。为这棵树上添加n条虚假边,接下来会进行q次操作:
一: 让结点 u 的权值增加 k ,并对与结点 u 相邻的结点中,深度比结点 u 小的结点重复操作1。
二:让结点 u 的权值增加 k ,并对与结点 u 相邻的结点中,深度比结点 u 大的结点重复操作2。
赛时本题做题想法:完全不会,直接开摆。
题解:?
AC 代码:?
4. 赛后总结:
本次模拟赛由于知识不够充分,编程能力较弱的原因导致分数低,我应该多做练习,了解新
的知识,加强编程能力,从而使下次避免出现此类的错误。