CSP复赛模拟赛4后补题报告


  日期: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. 赛后总结:
本次模拟赛由于知识不够充分,编程能力较弱的原因导致分数低,我应该多做练习,了解新
的知识,加强编程能力,从而使下次避免出现此类的错误。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值