昨天和sduwh打了场友谊赛。题目整体并不难,绝大多数都是基本的数学问题,然而出题的情况极其糟糕。之前就让队友去负责弄数学专题,看来队友也没好好弄,我也没去落实,是我做队长的失职,或许我本身就不适合做队长。
下面结合题目对本次比赛做一个总结:
A题:简单数学题。求N!末尾0的个数。N!=2^k1*3^k2*4^k3*5^k4……对于0的产生只能由2和5相乘得到,于是ans=min(k1,k4),而显然k1>=k4,于是ans=k4。对于给定的n,考虑不超过n的数中,有多少个能被5整除,有多少个能被5^2整除……有多少个能被5^m(<=n)整除,累加起来就是答案k4。
B题:计算几何。求两中心重合,焦点分别位于x、y轴的椭圆相交面积。简单的数学题,求出任意一个象限里的交点后,一重积分计算该象限内面积,结果乘4即可。可惜没看题。注意力都在C题上了。
C题:简单贪心。对于N,构造最小的正整数Q使得Q的各个位上数的乘积为N,无解时输出-1。一开始队友给我说从2开始除,其实从这里就开始错了。后面的debug都是在围绕着这个错误在进行:比如上一位得到的数与当前得到的数相乘小于10的时候怎么办?想到的是把其乘到上一位数中,最后再对结果排序,这样是错误的。比如n=201600,正确的结果是:2557889,而按照之前的算法得到的却是3556788,原因就是因为从2开始除,导致得到的数的低位并不是最大的。正确的做法是:要使得Q尽量小,则应当使得N的因子尽可能大的放在低位上,即从9开始除,依次得到低位到高位的数值。另外注意读题:Q是正整数,因此N=0的时候,应当输出10.而不是-1或者0。
D题:极其简单的hash+枚举。比赛时也没看题。
E题:枚举。N条边,能组成多少个不同的三角形。由于精力都耗在C题的debug上了,不然这题还是可以做的。排序后枚举最大的那条边i,和次大的那条边j,对于最小的那条边k只需s[k]+s[j]>s[i]即可。一种方法是二分查找使得s[i]-s[j]<s[k]的最大位置k,结果即为k-j。时间复杂度为n*2lgn,然而学长说这样搞,优化得不好可能会超时。。时限给了6s,我觉得如果是1e8/s的话,还是可以过的。。。题解上提出了n^2的算法:在前面查找最大位置k时,可以发现,当由n移动到k时,次大的边的上界R也会相应地移动,就是说不用再循环到n,因为下一次枚举的次大边长不会超过这次,所以枚举的最小的边的起点一定不大于上一次的位置,(表述能力实在有限,画图最容易理解了)于是枚举次大边L(从前往后,由大到小),和最小的边R(从后往前,由小到大),当R移动时,L的上界也随之改变,当L与R重合时结束循环,就变成n^2了。
F题:简单组合数学、模拟。给n、m输出C(n,m)组合的所有情况。
G题:数学题。斯特林数、贝尔数。同hdu 2512
H题:DP。整数划分问题。
I题:区间DP
J题:数论,费马平方和定理。求最小的平方和x^2+y^2,使x^2+y^2=0 mod p。
K题:计算几何。凸包+旋转卡壳。搞毛啊,队友一拿到题就做这题,说是贪心。然后就开始敲。。然后就没有然后了。
通过这次比赛,明白数学的重要性,也明白了队友并不一定可靠,数学专题什么的还是我自己弄吧,也不过就是辛苦点,多学点东西。