一模 (3) day1

第一题:

题目大意:给出m个小于n的数,求出出现次数大于m div 2 的数。 1<=n<=2^31   1<=m<=10000

 

解题过程:

1.看到m的数据范围比较小,直接 sort 排个序,统计每个数出现的次数 即可。

 

第二题:

题目大意:给出 分数a/b(0<=a<b<=1000) ,要求将其 拆成尽可能少 的分子为1的分数 之和,并且要求相同长度的 最大的分母尽可能小。

 

解题过程:

1.这题是黑书上讲ID—DFS的例子,直接套用,因为没法确定搜索的深度,所以必须人为定一个边界。对于分数的处理,直接通分+约分即可。直接用double除出来是不行的。

2.几个减枝:

剪枝A:首先先确定一个顺序,即搜索的时候按分母从小到大来搜,不能从大到小。。因为没法确定最大的那个 可以大到多少。

剪枝B:最后一个分数是不要枚举的,剩下待拆分的值就是最后一个分数,因此只要检查它的分母是不是比上一个分母pre大,并且分子是否为1。

剪枝C: 枚举当前的分母x的时候,会有一个上下界,首先要比上一个分母pre大(x>pre),其次这个分数不能比当前剩下待拆分的值(a/b)大,即 1/x < a/b  -->  x>b/a

最后如果当前还能拆dep个分数,由于这个分数必定比剩下的那些要大,所以 dep/x > a/b    -->    x < (b*dep)/a;

3.第一次写的时候感觉要最大的分母尽可能小,那么只要前面的分母大一些就好,所以枚举分母的之后从大到小,搜到第一个答案就exit,但是这样是错误的。因为要求每个分数的分子必须是1,虽然前面的分母比较大,但是可能最后一个分数的分子不是1.

 

第三题:

一个美国旅行代理商经常被要求去估计开车从一个城市旅行至另一个城市的最小费用。他有一个在通常路线上的大多数加油站的列表。列表包括了所有加油站的位置及当前每加仑汽油的价格。为了简化估计费用的过程,代理商使用了以下的简化汽车驾驶员行为的规则:
● 除非汽车无法用油箱里的汽油达到下一个加油站(如果有的话)或目的地,在油箱里还有不少
于最大容量一半的汽油时,驾驶员从不在加油站停下来。
● 在每一个停下的加油站,驾驶员总是将油加满。
● 在一个加油站停下之后,驾驶员将为旅程在快餐和糖果上花去 2.00 元。
● 在驶向加油站或目的地时,驾驶员不需要超过必须量的汽油。不需要“安全余量”。
● 驾驶员开始旅行时油箱总是满的。
● 每个加油站付款时四舍五入到分(1 元等于 100 分)。
你必须写一个程序以估计驾驶员在旅程上至少要为汽油和食品付多少钱。

 

解题过程:

1.感觉和NOIP的一道叫旅行家的预算的题有点像,那题是贪心,于是这题也果断贪心。题解貌似是动归,但是感觉不太对劲,题解里用一维的状态明显是不够的,还是贪心靠谱。

2.贪心策略这题比旅行家的预算要简单的多,因为只有当汽车到了某一个加油站,并且油量不足一半的时候,才有决策,其他都是模拟。对于这种情况,只要看不加油能到达的加油站中最便宜的那个,开过去,如果最便宜的还不如当前加油站便宜,那么在当前这里加。

3.用了2中的贪心策略还是WA了一个点,原因是当前在一个加油站,如果加满油可以直接到终点,且花费是cost1,但是它现在的油量少于一半,且后面还有更便宜的能到达到的加油站,那么按照原来的贪心,就会走到后面那个加油站,然后加满油,开到终点。  因为每次都是加满油,所以这样开到终点还有很多油,就会有浪费。。 所以还要维护cost1,最后再和原来贪心得到的ans 作比较,取小的 作为答案

 

posted @ 2014-08-22 18:47  lzw4896s  阅读(230)  评论(0编辑  收藏  举报