contesthunter NOIP模拟赛Day1 8.9

一、数三角形

题意:在平面直角坐标系中给n个点的坐标,求以它们做顶点,一共能构成的三角形的个数。

小论:n<=100,直接枚举三个顶点,判断它们是否共线,不是则增加答案。如果n增加到1000 的话,可将位于三、四象限的点绕原点旋转180°至x轴上方,然后把它们与原点连线后的倾斜角排序把倾斜角相同的方案(就是三点共线的情况)从总答案中删去。

情况:估计100分,实际100分。


二、4 和 7

题意:在m个格子中有n个格子中有药,第i堆药的粒数为a[i] ,位置为b[i]。从0出发,每次可以到右边4格或右边7格的位置,要使吃到的药最多(可不到m)。

小论:很容易想到递推。设f[i]为到第i个格子的最大值。则有f[i+4]=max(f[i]+a[i+4],f[i+4]);f[i+7]=max(f[i]+a[i+7],f[i+7]);

这个做法只能过60%的数据,而对于100%的数据,我们就要想想办法了。我们可以知道,第i堆药要从前面的第j堆药跳过来的话,它们间的距离应该为4x+7y(x>=0,y>=0)。接下来,我们把4x+7y罗列出来,4,7,8,11,12,14,15,16,18,19,20,21……发现了吗?18、19、20、21,4个连续的数!说明大于等于18的都可以写成4x+7y的形式。所以我们可以将药按位置从小到大排序后,设f[i]为吃第i堆药的最优解,s[i]为1~i的f前缀最大值。对于第i堆药,我们可以暴力枚举它前面的药,看它能否更新f[i],直到它们间的距离大于等于18,再用前缀最大值更新f[i]。

情况:估计70~90分,实际20分。之前交了60分的程序,最后40分钟想出了正解,可是时间紧张使我人也紧张,有些细节没处理好,反而还不如原来的60分……。(主要是原来以为暴力枚举会超时,就用了个麻烦的数据结构……)


三、反射镜

题意:在一个没有边界的平面直角坐标系中有n面两面都能反光且与坐标轴成45°角的镜子。光线从原点向右出发,碰到镜子反射,求光线走过t格后的横纵坐标。

小论:分别按镜子的横坐标纵坐标排序。模拟,由于它碰到第一面镜子就会反射,这使模拟变得更加简单。可记录按某种方向上次到达该面镜子的走过格子数,如果碰到循环可以直接取mod降低用时。

情况:估计60分,实际0分。当时傻傻地想都没想就连边了。结果,因为没有注意排序后点的编号问题,爆零了。


总结:不要把问题复杂化,不要想得太复杂。有句话说得好:no zuo no die。下手前再想想有没有更优更好打的方法,这样既能提高程序准确性又能降低编码难度性。


你可能感兴趣的:(contesthunter NOIP模拟赛Day1 8.9)