2013-9-15 考试总结

本文解析了一场算法挑战赛中的三道题目:求素数、取硬币和飞天问题。介绍了求素数的筛法原理及应用,取硬币问题中的贪心与动态规划方法,并详细分析了飞天问题中如何通过寻找中位数来最小化总代价。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

三道题 :求素数/取硬币/飞天

引用老师一句话总结:三道题的难度并列(非梯度),都可以有思路,但都不容易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

       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值