(按:本人乃新手一枚,文中思考仅供参考,主要还是给自己清理思绪用,若有不同的意见或更好的建议,洗耳恭听)
这是我们寒假集训队一批的第一次周末练习赛,形式是近三个小时做五道题,但感觉自己最近(应该是好长时间了)真的一直不在状态,想不进去。于是来写写博文,理一理自己的思绪。五道题,均抓自Codeforce, 两A两B一C,算是第一次比较正式地接触全英文的赛题了。这是我个人分类 练习赛 的开篇,因此在此给自己一个这类文章的内容概要,也就是自己想要或应该写些什么东西。鉴于自己这一次体现出来的相关英语词汇的欠缺,以及练习时的状态,我想基本上可以有这些:
1.比赛的每道题的题目,出处,题意,自己的分析过程与遇到的瓶颈,借鉴,优化,体现的知识点和技能点……当然会根据自己的掌握情况与需要安排详略;
2.本次练习赛遇到的重要的生词,词汇的积累。
3.自己本次练习的心态,本周学习状态的小结等。
I. Problems
A - Greg's Workout
Origin: Codeforces 255A
Main points: 有3个变量,输入n个整数,每3个作一循环,3个数依次累加到3个变量中,求3个变量中值最大的一个。输入保证3个变量的值不会相同。
Analysis: 应该很明显了……然而我还是用了一个数组存下了每一个数。但因为数据量真的很小(才20),也没什么关系吧……但代码会稍长些,数据量大的时候大家都应该会考虑到这一点,不纠结了,能不断发现并改进就好啦
Kernel code:
for (int i = 0; i < n; i++)
{
scanf("%d", &a);
type[i % 3] += a;
}
Tip: 对每一个输入数据的操作都独立于后输入的数据时,可以考虑边输入边操作;后续操作不再用到输入的数时可以用一个临时变量来存每一个输入的数
B - Code Parsing
Origin: Codeforces 255B
Main points: 输入一个只包含x,y两个字符的字符串(length <= 10^6),循环着做 对字符串中 第一对‘xy’的换位操作 或是第一对‘yx’的删除操作,直到不能操作为止,输出最后的字符串。输入保证最后的结果不会是一个空串。
Analysis: 当时做的时候真觉得自己是个愣头青,看懂了题意就盲目跟着题面的算法去做,结果自然是浪费了大量时间写、分析情况,还注定要超时(为什么自己想,当时真觉得自己连最基本的思维能力都没了)。直到练习赛快结束时才猛反应过来,若从这个算法的总体效果考虑,它的换位和删除,不管过程如何,最后完成的是x与y的对消,最后的字符串就是余下未配对的所有x或y。为自己的蠢泪目……
Main idea: 分别记录下x,y出现的个数cx,cy,则最后的字符串为|cx - cy|个x或y。
Tip: 对一看就可能会超时的‘机械算法题‘,不要盲目跟着写代码,而是从它达到的整体效果、它的结果考虑,从效果推出结果。这些题可能过程是复杂的,而达到的效果是简洁而明了的。
C -Wasted Time
Origin: Codeforces 127A
Main points: 在坐标轴(|x|,|y| <= 20)上有一折线A1A2...An,起始点为A1,终点为An(2<= n <=100),现在要在k个坐标轴上以A1A2...An的顺序画出这一折线,速率为 50/s,输入n,k,及A1,A2,...,An 的坐标,输出画折线所需的总时间(绝对或相对误差不超过10^-6)。
Analysis: 主要是没做出来的同学们大都说看不懂题目……没办法。
D - Canvas Frames
Origin: Codeforces 127B
Main points: 有n(1<= n <= 100)根长度不一(1 <= len <= 100)的木条,不能折也不能粘,输入n与各木条的长度,输出最多可以做几个矩形框。
Analysis:排序或查找。dq大神说直接计数(桶排序)比较好。确实。
Kernel code:
for (int i = 0; i < n; i++)
{
scanf("%d", &t);
len[t]++;
}
E - Almost Arithmetical Progression
Origin: Codeforces 255C
Main points: 求一个整数列{bn}(1 <= n <= 4000)最长的隔位两个数相等的子数列的长度。
Analysis: 动态规划(Dynamic Programming)。重点是找的它的状态转移方程。(注:这道题我还不怎么会做,这是别人的代码里抠来的,码着先)
Kernel code:(参考)
int max = 0;
for (int i = 1; i <= n; i++)
{
int last = 0;
for (int j = 1; j < i; j++)
{
dp[i][j] = dp[j][last] + 1;
if (b[i] == b[j])
last = j;
if (dp[i][j] > max)
max = dp[i][j];
}
}
max++;
II. Vocabulary
cyclic a. 循环的,周期的
corresponding a. 符合的,相应的,相关的
quotes n.(pl.) 引号
guarantee v. 保证,担保
unambiguous a. 明确的,无歧义的
algorithm n. 算法
operation n. 操作,[数]运算
runtime n. 运行时间,运行时
consecutive a. 连续的
polyline n. 折线
segment n. 部分,[计](字符等的)分段
intersect v. 相交,交叉
coordinates n.(pl.) 坐标
exceed v. 超过
relative or absolute error 相对或绝对误差
arithmetical a. 算术的,算术上的
progression n. (事件的)连续;一系列;[数]级数
cross out 划掉,删掉
III. 小结
Too young too simple, sometimes naive. This just describes my status recently. So many things remain unambiguous. Keep on, buddy.