[CSUST] 新生第二次月赛解题报告
题目传送门: http://www.acmore.net/JudgeOnline/contest.php?cid=1027
A::难度值4
考点:指针的运用
CodeForce 251A 官方题解:
Let's select the rightmost point of ourtriplet. In order to do this we can iterate over all points in ascending orderof their X-coordinate. At the same time we'll maintain a pointer to theleftmost point which lays on the distance not greater than d from the currentrightmost point. We can easily find out the number of points in the segmentbetween two pointers, excluding the rightmost point. Let's call this number k.Then there exist exactly k * (k - 1) / 2 triplets of points with the fixedrightmost point. The only thing left is to sum up these values for allrightmost points.
思路: 从右向左遍历数组,设置两个指针I,j分别控制3点中的首尾两点,只要a[j]-a[i]<=d ,则在固定尾指针的情况下,从首指针之后的数中任意挑选两个都能成为3 points,那就是用C(x,2)组合数就能解决,由于只有两个指针的遍历移动,所以复杂度为O(2*n)
注意:涉及到组合数, k * (k - 1) / 2会超出int范围,所以要使用long long (VC下是__int64)
B:难度值0
考点:字符串比较函数
先比较两个字符串的长度,长度相同时strcmp两个字符串就行,不过要注意审题数的范围是10^100所以不能用int或long long,不要盲目提交。
C:难度值 1
考点:递归
每一个蜂窝步数 = 左边邻近两个蜂窝步数之和
因此递归解决,周练原题
D:难度值2
考点:字符串应用
数据很弱,用暴力就能够做出
比如abbab,我们插入无关字符构造成新的字符串 #a#b#b#a#b#b#
这样做的好处是不用判断它是轴对称还是中心对称
对于每一个字符向两边拓展遍历,找出他的最大回文数后,遍历一遍取最大值即可
不用manacher算法就可以解,如果这题数据是100000以上那么就必须用manacher来做了
以下是manacher的一个解析,大家可以学习一下这个做法
http://blog.sina.com.cn/s/blog_70811e1a01014esn.html
E:难度2
考点:sort排序
结构体排序。
姓名查找如果用哈希表更快,但这题数据不强,直接依次匹配即可。
F:难度3
考点:模拟
直接按他的规则模拟走法,走过的点标记为已经访问过,如果走到访问过的点,就说明成环了。
G:难度3
考点:位运算
分别取异或,最后剩下的数就是要求的数
a,b 看为二进制数 比如 1和15的二进制分别是:
0001
^ 1111
________
1110
这时候假设再来一个15 取异或
1110
^ 1111
________
0001
我们又得到了1,这时候我们发现,出现偶数次的数字被自己抵消了,即a^a=0
我们运用这个结论可以很快得出答案,复杂度O(n)
H:难度2
考点:点与直线
判断最多有多少点在同一直线上
任意两点确定直线后每个点依次带入直线方程。求出最大值即可。
I:难度2
考点:数据结构——栈
题意明确是栈的思想,这题明显用数组模拟栈更方便
back就把当前指针向前指,forward就把当前指针向后指
visit就把尾指针+1。
注意有首页和尾页,指针要注意处理不然容易越界
J:难度1
考点:简单循环
直接循环找每个窗户第一个”….”所在的行数就行