第一题:
题目大意:和day1一样,给出m个小于n的数,求出出现次数大于m div 2 的数。 数据范围加大,1<=n<=2^31 1<=m<=3000000
解题过程:
1.一开始写了个数组模拟链表 hash,按 mod 指数p 分类,用一个数组记录 每一类的个数,如果每一类个数全部都小于等于一半,那么无解,如果有一个大于一半,那么遍历一边这一类的所有的元素,用一个表保存下来,看每个数出现了多少次。 超时一个点。
2.输入用getchar 优化后,最大数据0.4s过。
3.还有一种算法,只要找出第m/2小的数,看它是否和最小的数相同,如果是,输出答案,否则无解。 至于找出第k大,快排或者树状数组或者线段树随意。
第二题:
题目大意:对一个环求最大连续字串。元素个数N<=1000000
解题过程:
1.对线性表求最大连续字串 有O(n)算法,一看到这题感觉应该是原来算法的改造。。考虑环比线性表特殊的地方,就是可以头取一段,尾取一段。那么先直接套用线性表的算法做一遍,然后特殊处理头取一段,尾取一段的情况 即可。。 那么用F[i]表示前i个数的最大前缀和,g[i]表示后i个数的最大后缀和。 那么枚举i,求出max(F[i]+g[i+1])即可。一开始由于F[0]和g[n+1]的值没有复制成负无穷大,碰到全部是负数的数据就挂掉了。
2.还有一种算法更加巧妙:对于头取一段,尾取一段,那么只要求出 最小连续字串,然后用全部数的和减去它就好了。。
第三题:
题目大意:给出一条线上车站的坐标,车费由两个车站之间的距离决定,求出从车站s到达车站t的最小花费。
解题过程:
1.裸的图论题,直接写个floyd 就过了。
时间: 2024-12-29 06:47:30