三道题 :求素数/取硬币/飞天
引用老师一句话总结:三道题的难度并列(非梯度),都可以有思路,但都不容易A
一题一题分析:
1):
我用的是先将100000内的素数跑出来,制表然后枚举、果断TLE
正确方法是筛法50000后再筛法,然后就能A了。。。
暂时不会筛法,不过今天就应该会了。待会实现;
2):
刚看题时以为时DP就将其放到最后(写不写还不一定)
结果老师说因为数据范围的缘故贪心都可以A。。。。。
3):
很奇葩的题。中位数的题我用平均数也过了相同效果。。。。。
先不写了。粘老师的Sol:
质数
题目初窥:
乍看数据范围似乎很恐怖。R,L<=maxlongint.
深入思考:
仔细观察后发现 R-L 只有 1000000。又 R 最大到 maxlongint,也就
是说 L..R上的合数的最小质因子不会大于 50000, 否则这个数的乘方
就会比 maxlongint还要大了。
算法:
先把 50000 以内的素数求出来,然后用这些素数将 L 到 R 的合数筛
掉即可。复杂度是 O(50000log(50000)+prime*log(r-l))。可以在时
限内出解。
7.31 的福星 pathhead那道题。
也是类似于筛法求素数。
再复习一下。
筛法求素数的效率是很高的。能到N*log(n)。
宝藏
各种乱搞,因为数据量不大。所以都可以做。
【贪心】
枚举到哪个井结束,然后把到这口井路上花费的时间去掉,再用剩下的时间所有金币的最大值。
观察样例,我们有14分钟,如果在第一口井结束,路上不花费时间,我们可以获得10+8+6+4+2=30 金币
如果在第二口井结束,我们只有11分钟可以获得金币
第一口井方案如上,第二口的方案是14 10 6 2 ,时间还有多余,一共获得62
如果第三口井结束,我们只剩下6分钟。 第三口井的方案是20 14 8 2
那么这三口井中金币我们可以挑出最大的6个数 20 14 14 10 10 8 所以答案是76
其实,这里如果数据量很大,我们可以维护一个小根堆。
【动归】
f[i][j]表示 第i分钟,人在第j个井口,最多能拿到多少金币。
f[i][j]= max{f[i-k][j-1]+s}
s为i-k+1 到i 之间,减去从第i-1到第i个井口的时间,在第i个井口拿到的金币的个数。
飞天
【题意简述】
给出N个非负整数。对于区间[l,r],求
其中x为某一整数。
【解决方法】
将所有h[i]对应于数轴上,问题转化为找一个点,使所有的点到这个点的距离和最小。至此,很多人已经发现中位数所对应的点可以取到最小值(具体的证明在这里不再详述,很多书籍上都可以找到),因此所有展台的高度应为区间[l,r]中的中位数。因为要求最小的代价,所以还需要知道区间[l,r]所有数的和,以及小于中位数的所有数的和。
求中位数的方法有很多,下面介绍几种方法。
◆方法一:
对区间[l,r]排序,然后线性扫描得到答案。
复杂度:O(MNlogN)
期望得分:50
◆方法二:
将所有的高度排序,记录展台的编号。线性扫描后同样可以得到答案
复杂度:O(NlogN+MN)
期望得分:70~80
◆方法三:
先预处理出每个区间的答案,读入后直接输出。这时,需要维护一个大根堆和一个小根堆,其中小根堆中每个数都不小于大根堆中的最大值。枚举区间的起点,依次向后加入数,只需控制大根堆中数的个数小于等于小根堆的个数。那么大根堆中最大的数就是中位数,大根堆中所有数的和就是小于中位数的所有数的和。具体实现请看标程。
复杂度:O(N2logN+M)
期望得分:100
中位数的题目
1626 1627