这第一次的IPEOI还是挺简单的,考了一些比较基础的知识,只不过绕了一点点,但可惜还是有很多人没有想出正确的解法。题面在这里:http://pan.baidu.com/s/1eQqah7W。
下面是解题报告:
【A:传纸条】
【题意分析】
首先有一个长度为S的线段,有N架纸飞机,在第i个时刻被放出的纸飞机会被赋予一个Vi的速度,并做匀速直线运动。而如果一架慢的纸飞机被一架快的纸飞机追上,则快的纸飞机马上掉落。如果只能在整数时刻放出纸飞机,而且每个时刻只能放出一架,那么最多能到达终点的纸飞机有多少架?
【算法分析】
首先,因为纸飞机间只有放出时刻的区别,所以我们只需要关心具体的到达时刻就可以了,这可以用一个double算出来,注意一定要double,向上和向下取整都有反例使其出错。然后一个最长上升序列就可以了。为什么是最长上升序列呢?因为只有到达时间依次上升,才能够不相互碰撞!所以又因为是最长……所以必定到达终点的纸飞机数是最多。
【B:投票】
【题意分析】
给出一些长达百位的整数,并且保证其中有一个整数的出现次数超过半数,求这个整数,只给3.5MB内存,而且这些整数的个数在百万规模。这其实是一个经典的问题了。
【算法分析】
因为内存太小,而且整数的大小太大,不能用计数排序,而且连存都不能存,可谓是条件非常苛刻。但是其实真正的算法只有一句话:将所有不足百位的数前面补零,接着统计每一位上出现次数最多的数,然后直接将这些数按顺序输出,并去除前导零。这个算法的正确性证明不难想,因为出现次数最多的整数对于其的每一个数位的相应贡献肯定大于其他所有数的数位贡献和。
【C:YTC的坐标轴】
【题意分析】
给出Pi和Vi,求对于每一对不重复的i和j,其的联合权值之和。
【算法分析】
其实这一题很简单,首先排序一遍,从大到小,就就可以直接消去max函数的影响,就将原函数消成了Vj*(Pj-Pi)(i<j),俨然简单多了。而后面的Pi-Pj则可以从上一个函数的值来推导,可以直接看一下标程来理解一下。
【D:思胜的路线】
【题意分析】
给出N个城市,这些城市中的K个重要城市,以及M条路线,问从1号城市途径这些所有的重要城市到达第N个点的最短路径是多少。
【算法分析】
首先,用Floyed求出任意两点间的最短路,再枚举重要城市的排列,再求相应的总最短路径即可。
下面给出标程:http://pan.baidu.com/s/1kTu9CSf
压缩包的密码是#include<con>。细细理解一下,其实还是非常之简单的,但是比较绕。