目录
前言
来到SDNU-ACM的第一场比赛,怎么说,前两小时a了两题,后三小时只加了9次罚时,挺不理想的吧。第一次体验ICPC赛制(虽然是单人),五个小时面对着墙扣题真是又快又折磨。
Problem A.下一个
比赛回顾
啊这个没什么好说的吧,签到题捏,就是交的时候一直404卡了好久,我还以为是网站的问题结果是我网不好,师哥帮忙连了224的网才顺利交上૮₍ °□°₎ა
AC代码
#include <bits/stdc++.h>
using namespace std;
int main() {
char a;
while (cin >> a) {
if ((a < 90 && a >= 65) || (a < 122 && a >= 97)) {
printf("%c\n", a + 1);
} else {
cout << "non-existent" << endl;
}
}
return 0;
}
Problem G.简单的数学
思路
gcd(i , j) * lcm(i , j) = i * j ,分子是j = 1到i的连乘,其实就是i的阶乘,所以累和的每一项都是1,加起来就是n啦!
比赛回顾
感谢跟榜,如果不是跟榜我可能根本不会看这个题,但是他确实是跟A题一个水平捏。
初等数论小结论,我写完了gcd和lcm的函数才意识到这个事情,因为对自己隐隐约约的印象并不肯定甚至又推了一下,以后要看好题有个大思路再开始敲代码啊啊啊!
在赛场上不知道脑子为什么短路写了前n项和公式wa了几发很是惭愧૮₍ ˊ ᵔ ˋ₎ა
AC代码
#include <bits/stdc++.h>
using namespace std;
int main() {
long long int n;
cin >> n;
cout << n << endl;
return 0;
}
Problem C.勇者之塔(未A)
有点可惜但没那么可惜的题。
思路
可能一些初学者看到这个题的第一想法会跟我一样,一步步模拟循环,但是这样是会T的哇!
那么我们先来关注题目几个重点:
- 每次走出矩阵(无论是行还是列)都会直接去到下一层的(1,1)位置。
- 每层都是一样的。
- 每次走的都是一样的。
然后我们再想一想,如果某一次突然走出矩阵了,上到了第二层的(1,1),那么从第二层上到第三层的操作和从第一层上到第二层的操作应该是完全一样的。想到这里,其实主要思路和优化方案就成型了耶!
没有走出第一层的情况大概都能写出来吧就不细说了。
现在来求第一次走出矩阵时是第几步:我们把行和列分开来想,先用矩阵的行除去每次走行的数目再加1。列同理。我们记录下行和列走出矩阵所需的步数然后进行比较,取更小的步数记为j,因为只要有行或列走出矩阵了就会到达下一层了。
接下来求最终到第几层:每次走到j步的时候就会上一层,所以最终层数就是,总步数 / j 再加1。
接下来求最终的行和列:我们只需要知道到达最后一层的(1,1)时还剩几步即可,即,总步数 % j * 每步走的行/列数目再加1。
到这里我们所有需要求的东西就很清晰辣,接下来只要输出就可以啦!
*这里再说一句前两天刚看到的:scanf / printf 的速度快于解绑后的cin / cout快于cin / cout。如果怕T可以直接用scanf / printf。
比赛回顾
一开始飞速写了嵌套循环,果不其然地t了,然后开始是一层层去循环,想了不短时间吧,其实反回头再看并不是很复杂就是有点麻烦。就以4次t告诫自己不要怕麻烦,想多一些会让程序简化一些。然后就开始wa辣!第二天问了师哥才想通问题所在,如果恰好走到边界的时候也是需要下一次走才能去到下一层,所以不可以用向上取整而应该+1。(见代码)
下面的代码大概是可以ac了
#include <bits/stdc++.h>
using namespace std;
int main() {
long long int h, w;
//矩阵的行和列
cin >> h >> w;
int num;
cin >> num;
long long int x, y, cishu;
//每次走的行列和次数
long long int endx = 1, endy = 1, cnt = 1;
for (int i = 0; i < num; ++i) {
cin >> x >> y >> cishu;
if ((x * cishu < h ) && ( y * cishu < w) ) {
endx += x * cishu;
endy += y * cishu;
}
//先判断是否会出第一层
else {
int j, k;
j = (h - 1) / x + 1;
k = (w - 1) / y + 1;
//就是这里出错了,应该求到达下一层的最短步数,如果正好到达边界是不能到达下一层的
if (j > k) {
j = k;
}
cnt += (cishu / j);
endx = 1 + x * (cishu % j);
endy = 1 + y * (cishu % j);
}
cout << cnt << " " << endx << " " << endy << endl;
cnt = 1, endx = 1, endy = 1;
}
return 0;
}
总结
第一次打比赛确实有成长,首先,跟榜真的真的十分重要(毕竟我只是小辣鸡),有些纸老虎题是需要一些大佬帮忙找出来的。其次,因为在C题上摩擦了很久很久所以自己有在一步一步cout检查哪里错了(虽然还是没找出来吧),自己纠错是一个很重要的能力。最后就是读题读题读题想好了再去写代码,尽量还是不要写完想通删掉,三人一机的时候可能真的会被队友锤叭。
希望我能塌下心来实实在在提升自己,希望下次比赛能进步一些吧。