如火如荼的 CCNU ACM 2015 年新生赛就这么结束了,下面是各自出题人提供的题解,供大家讨论交流使用。
文章结尾会有命题人联系方式,如果对某些题目有疑问,可以联系命题人。
玩斗地主的时候你的对手掉线了,你现在有 n 张手牌,对手还需要 k 秒连接,问你是否有办法等到你的对手连接
只要判断 n 是否大于 k 即可 n>k 的时候为 NO 否则为 YES 。
张鑫
有n张牌按照时间每秒出现一次,你需要从一个点出发连续不断的拿起这个牌,你每次从一个点传送到另一给点需要消耗两点之间欧几里得距离的平方,如果你这一秒没有进行传送则回复100点能量(不能超过最大值S) 问你最多能连续拿起多少张卡牌。
因为必须是连续不断的拿,所以只需要枚举起点(n张卡牌的位置),然后暴力的求出你从这个点出发能连续拿到的最多的卡牌,然后求个最大值即可, 有一个坑点在于连续拿两个相同点的卡牌并不会消耗能量并且会回复100点能量
张鑫
告诉你手上的n张牌分别是什么牌,按照斗地主的规则。
问你这回合有多少种出牌方法
所有情况如下:
单张,对子,连对,顺子,飞机,炸弹,4带2
坑点在于,飞机打33344434 和4带2打 33334444 为一种情况 所以需要进行判重
张鑫
给出 n 个点 P1,P2,...,Pn ,要你确定一个点 O ,使得 cost(O)=∑2π|OPi|2 最小。
设 O(x,y) ,那么 answer=min(cost(O))=min(2π∑(x−xi)2+(y−yi)2) 。
这样显然有 answer=2πmin(∑(x−xi)2)+2πmin(∑(y−yi)2) 。
我们来考查 ∑(x−xi)2 ,这也就是 nx2−2(∑xi)x+(∑x2i) 。这是一个关于 x 的二次函数,并且在 x=−−2∑xi2n=∑xin=x¯ 处取最小。
同理 ∑(y−yi)2 在 y=y¯ 处取最小。所以答案就是 cost((x¯,y¯)) 。
张静之
某人行进距离是 L ,速度是 V ,但是这个人每走 T 秒会停下来 T0 秒。问这个人用时多少。
每 T+T0 秒,前进距离是 S=VT 。那么用时 (T+T0)[LS] 之后,此人剩距离 LmodS ,用时 LmodSV 。
要注意的是,如果 LmodS=0 ,那么上述算法最后的 T0 多算了,应该减去。
张静之
给定一个小于 10100 的整数 N ,问每一位的和,并用拼音输出
显然 N 很大,因此我们不能简单的用整形变量定义并存储,因此我们得使用字符串存储,然后遍历整个字符串,将和求出,存于 Sum 中,然后再对 Sum 进行数位分离,并存于数组 ai 之中,然后在外面定义一个二维数组存所有的拼音,倒序 输出 ai 所对应的拼音即可,唯一的坑点在于,如果和为 0 的话,则不用数位分离,特判即可。
曾子韬
设 ps(k,n)=1k+2k+...+nk ,求 2∑i=1k(2k2i−1)ps(2i−1,n) 。
直接计算超时,应化简。
设 Sn 为答案,那么我们发现 Δn=Sn−Sn−1=2∑i=1k(2k2i−1)n2i−1 。
上述形式启发我们利用二项式定理,考查:
于是得到 Δn=(n+1)2k−(n−1)2k 。故:
P.S 对于此类题目我们更建议通过计算找规律,归纳得到公式。
张静之
给定一个特殊的序列 A ,求该序列前 k 项的和。
根据题意很容易发现给定的这个序列形如 1,2,2,3,3,3... 以此类推的形式,然而 T 足够大,因此每输入一次,来暴力计算前 k 项的和显然在时间上是不可过得,但是我们发现序列 A 中的每一个元素是固定不变的,因此我们可以在输入之前,通过一重循环,预处理出这个特定序列(自行脑补杨辉三角的求组合数的代码,如果我们再输入之前先打好杨辉三角的表,是不是我们在每一组输入时,直接调用表内的内容就可以了?),并存于数组 ai 之中,然后我们再开一个 Sum 数组,用来记录前k项的和为多少,记为 Sumk ,当这个处理完后,对于每一个 k 直接输出 Sumk 的值即可。
P.S. 这题还有很玄幻的找规律做法,可以不用预处理,各位可以开动脑筋去想,而这道题我的题解所涉及的是未来思维题一个很重要的思想——前缀和预处理,希望各位能够好好领悟,有所收获。
曾子韬
按照题目给出的方式构造圆,问 Ok 的半径。
利用几何关系求出 A,B,C 的半径,然后再以 C,O 切点( E )为原点, E 处切线做极轴对图形进行几何反演。
发现 A,B,O1,O2,...,Ok 是一系列相切的全等圆,十分容易求出 Ok 。
之后再一次反演,得到所求答案。
P.S 本题是本次比赛难度最大的题目,是出题组为了不让参赛选手解出全部题目设置的。比赛时应该迅速认清这类题目的意图,避免在此类题上浪费时间。
张静之
从 n 个给出的数中选出三个数 p,q,r ,使得 pq−r 最大。
数据范围比较小,可以枚举 p,q , 在剩余的未取的数中找最小的数作为 r ,如果选择到的 p,q,r 两两均不同,则记录最大值即可。
张静之
给出一个不断入栈和出栈的过程,询问其中栈中的最大值和出栈过的数中的最大值。
对于出栈过数的最大值只需用一个数记录,是容易的。
对于栈中的最大值,我们可以用数组 stk 和 cnt 记录栈中数据和数据量,并同时用 fi 记录 max(stk1,stk2,...,stki) 。
v 入栈时,只要 stk++cnt=v 模拟入栈,并记录新的 fcnt=max(fcnt−1,v) (如果 cnt=1 ,那么 fcnt 直接等于 v )。
出栈时,只要 cnt=cnt−1 即可,可以忽视原来的 fcnt 。
对于要求得到栈中的最大值,显然就是 fcnt 。
张静之
用 K 元可以在 N 天内任意一天买赌博机,然后选取买进赌博机这天及之后的某天将其卖出,问最大收益。
显然 O(n2) 的复杂度时间上过不了,因此我们得想个办法优化它,我们不妨从后往前来维护一个 mai 数组,表示从第 i 天买进该价格下的赌博机后后及到最后卖出时的最大单价,注意第 N 天买进时卖出的最大单价也就是第 N 天的买进价格,然后倒着扫去更新。然后从前往后扫一遍,求出第 i 天买进后可以获得的最大利润,维护一个最大值即可。有个坑点在于,可能买进当天后之后一直在亏本,所以当天买就得当天卖,让收益为0,还有一点常识是,赌博机的数量只能买整数个。
查云皓
喵同学有 100 只小鱼干作为本金打牌,赢一局能赢 m 只小鱼干,输一局会输掉 n 只小鱼干,问:她赢 x 局输 y 局后能吃到多少只小鱼干?
就是个简单 a+b , ans=100+mx-ny ,因为问的是能吃到多少,所以当 ans<0 时,应输出 0 ,其余直接输出 ans
蒋欣余
Name | ||
---|---|---|
张静之 | [email protected] | 3070414186 |
曾子韬 | [email protected] | 452064635 |
张鑫 | [email protected] | 371384272 |
蒋欣余 | [email protected] | 605451377 |
2015 张静之