日期: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