CSP-J复赛模拟赛后补题报告Day3

日期:2023年10月4日星期三

S10698

1.比赛概况

比赛共有4题,满分400分,赛时拿到10分,其中第一题爆零,第二题爆零,第三题爆零,第四题10分。

2.比赛过程

首先对题目进行了一遍浏览,感觉第四题很简单,然后就做了第四题。因为对第四题代码内容的运用不够熟练,以及最后才发现题目求的是最小的方差,所以在第四题上用了接近两个小时的时间,导致做后面题目的时间比较紧张。然后我又做了第三题,看到数据提示写着有10%的数据绝对值都相同,我就根据这10%的数据推出了一个自以为非常正确的数学公式来做这道题,最后也没对,做第二题的时候只剩下不到五分钟了,刚打完头文件和freopen,比赛就结束了。

3.题解报告

(1)第一题:数字对应(digit)

情况:赛中爆零,已补题。
题意:给了你一个长度为n的序列A,让你替换序列A的每个元素,构成一个序列B,输出字典序最小的序列。

【注意】:①序列B中出现的数字不可以与序列A中出现的数字重合。

②序列B中的数字只能对应一个序列A的数字。

③相同的数字与相同的数字对应

赛时本题做题想法:比赛时时间不够了,只根据几个样例和大数据样例进行了偏分,最后就爆零了。

题解:先循环n次输入序列A,存到数组里,同时用一个map映射的m数组进行当前数字是否有过的标记。再循环n次,如果当前t数组的值不为零,就直接输出,否则就在m[tot]值不为零的情况下,令tot自加,直到m[tot]没有用过,值为零,再将tot的值赋给t数组,并把m[tot]标记为一,随后输出tot。

AC代码:

#include <iostream>
#include <cstdio> 
#include <map>
using namespace std;
const int N=1e7+10,M=2e6+10;
int n,tot=1;
int a[N];
map <int,int>m,t;
int main() 
{
	scanf("%d",&n);
	for(int i
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值