首页 > 代码库 > 一模 (3) day1

一模 (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.

 

第三题:

题目大意:

 

一模 (3) day1