痛彻心扉。
我坐在电脑前,看着洛谷排行榜上的125分。然而我感受到的并非从三等变为二等的些许温暖,而是从三等到没有奖项的彻骨寒风。因为,这125分中的百位,实际上根本就不存在——它只是在工作结束之后换下一个残缺的齿轮之后得到的没有用的成绩。
而这就是我,一个跳梁小丑——在赛前终于理解了CSP-S2023的前三题解法,然而却在一道难度连入门都不如的题目上失掉了一切。
中午时,我和同校的一位同学一起去广附食堂吃饭。我跟他一起津津有味地聊着上午的战况。
他轻松地做出了前三题,让只做出前两题的我望尘莫及。我想要从他身上获取到什么,然而我没有任何方法。我问了他一句:
“你的目标是什么?”
他答道:“当然是CSP-S一等。”
对于我们——一群信竞生而言,CSP-S就如同我们的高考一般。它是打开NOIP等一系列主赛季赛事的钥匙,也决定了一个学生在接下来整整一个学年内的学习曲线,甚至是命运。
我曾经在集训的一天里信誓旦旦地对我们深受敬爱的教练保证道:“今年我的目标就是CSP-S一等。”我无比确信地认为自己能实现这个目标。
随后在一股呼啸的寒风中,我走进了考场。
走进考场之后,我看见了一把密码锁。这把密码锁极其脆弱,在设定密码之后只能拨动五个拨圈中的其中一个,或相邻的两个,否则其精密的机械结构就会直接因过大的摩擦力而分崩离析。
但是其脆弱的性质正好决定了其拨动方式只有 $90$ 种。
我立刻“解决”了这个问题,并将这份代码丢在一边:
#include<iostream>
#include<unordered_map>
using namespace std;
int n,a[5];
#define hs_val (a[0]*10000+a[1]*1000+a[2]*100+a[3]*10+a[4])
unordered_map<int,int> mp;
int res;
int main(){
freopen("lock.in","r",stdin);
freopen("lock.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++){
for(int j=0;j<5;j++)scanf("%d",a+i);
for(int j=0;j<5;j++){
for(int k=0;k<9;k++){
a[j]++;
a[j]%=10;
mp[hs_val]++;
}
a[j]++;
a[j]%=10;
}
for(int j=0;j<4;j++){
for(int k=0;k<9;k++){
a[j]++,a[j+1]++;
a[j]%=10,a[j+1]%=10;
mp[hs_val]++;
}
a[j]++,a[j+1]++;
a[j]%=10,a[j+1]%=10;
}
}
for(auto& i:mp){
// printf("%d %d\n",i.first,i.second);
if(i.second==n)res++;
}
printf("%d\n",res);
}
当时我看到这份代码极其轻易地解决了小样例和大样例后,我便为了帮助小L消除所有的可消除子串、帮助各位发明高级语言的大佬们重写结构体的内存分配方式,以及解决在一片树状森林中以最高效率种树的问题而努力。
这三个问题消耗掉了我的剩下三个半小时时间。
最终检查代码的时候,向来熟悉参加 AtCoder 比赛的我,甚至高傲到连解决密码锁问题代码的 main
函数都没有看一眼。
我失望地走出考场,向我的父母汇报道:
“CSP-S一等无望了。”
在路上我仍然想着其他三道题,唯独除了那把已经被放在角落积灰的密码锁。
回到家后我拿到了自己的代码。
正当我暗自庆幸自己没有忘记删掉自己的调试代码后,我猛然发现自己的代码仅有 $40$ 分。
“这怎么可能。”我想道。
随后我在脑中一遍遍重演着我的算法,甚至已经证明了这就是一个没有错误的算法。
最后我开始重新审视我的代码。直到我看到了这一行。
for(int i=1;i<=n;i++){
for(int j=0;j<5;j++)scanf("%d",a+i);
// ...
}
我痛苦地捂住自己的脸,将这一行最后的 a+i
改成了 a+j
,将其提交上洛谷。
随后那个熟悉的庆祝图片出现了。
算法是被证明出来的正确算法,然而却配上了一个错误的齿轮。
庆祝图片对于常人来说,是喜庆的歌声。
但对此时的我来说,却是为我送葬的哀乐。
我不得不接受那个令我痛苦至极的现实——我失去了整整 $100$ 分。
窗外没有一丝的风声。家里是极其安静的。
我躺在床上,久久不愿起身接受这个事实。
但是好像有人在叫我起身。
于是,便有了这篇文章。
从来没有一个时刻,如此时此刻般真实。
Update on 2023/10/24
用了一节信息课+一个中午的时间把 CSP-S 2023 的 T3 A掉了。用了 $167$ 行。
实际上这道题的思维难度并不高,并且 $N,K \le 100$ 的数据范围给了暴力遍历充足的发挥空间。
问题主要在于当时没有花时间看懂具象化题面导致一直在用错误的内存分配方法进行实现。下次做题之前必须看完所有的题面。
如果你能熟练地使用指针的话,那么做这道题就像是在完全照题意模拟。至少我就是这样的。
但是一个半小时的时间放在考场上仍然是不够的。
菜是原罪。
—— 任宝硕
Update on 2023/10/25
用了 $25$ 分钟把 CSP-J 2023 的 T3 A掉了。这道题实际上根本不是大模拟,我的 $55$ 行代码直接证明了这就是一道正常的模拟题。
主要错误在于心态出现问题导致没有在考场上想到快速计算的方法,并且忘记化简导致有理数与带根号实数的加法时间极其复杂并且很难调对。
对于这份赛后打的代码,我仅仅调试了 $4$ 遍直接 AC 了。
明年就是初三了。希望到那时不要有太大的压力,以平常心面对这场比赛。因为那也是我的最后一次机会了。
Update on 2023/10/26
用了 $14$ 分钟把 CSP-J 2023 的 T4 A掉了。这道题码量不大,纯靠思维,就算在我丝毫不压行的码风下也仅用了 $42$ 行代码。
核心思维就是分层图 Dijkstra 。
标签:10,血泪,代码,CSP,int,后人,2023,密码锁,警示 From: https://www.cnblogs.com/SyuAyaka/p/18022887