码迷,mamicode.com
首页 > 其他好文 > 详细

二模 (2) day1

时间:2014-09-07 15:55:05      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   2014   问题   sp   log   on   c   

第一题:

题目描述:淘汰赛制是一种极其残酷的比赛制度。2n名选手分别标号1,2,3,…,2n-1,2n,他们将要参加n轮的激烈角逐。每一轮中,将所有参加该轮的选手按标号从小到大排序后,第1位与第2位比赛,第3位与第4位比赛,第5位与第6位比赛……只有每场比赛的胜者才有机会参加下一轮的比赛(不会有平局)。这样,每轮将淘汰一半的选手。n轮过后,只剩下一名选手,该选手即为最终的冠军。
现在已知每位选手分别与其他选手比赛获胜的概率,请你预测一下谁夺冠的概率最大。 n<=10

 

解题过程:

1.概率的题目以前很少碰到,每位选手在第一轮比赛存活下来的概率很好算,因为每个人只可能和一个人比赛,但是第i轮就不好确定了。 比如 第一轮1 和 2比 1存活下来了,3 和 4 比 ,有可能是3 留下来 ,第二轮1和3比,也有可能是 4 留下来,第二轮1和4比。 假设 1 存活到第2轮的概率是 P1,3存活下来的概率是P3,4是P4, 那么只能是这样计算:设1和3对打存活下来的概率是P(1,3),和4对打是P(1,4);那么 1 在第二轮存活下来的概率是 P1* (  P3 * P(1,3)+P3 * P(1,4)  ) ;

2.弄清楚了概率的计算公式之后,用F[i][j]表示编号为i的人存活到第j轮的概率。F[i][1]=1。那么需要确定第i个人在第j轮有可能和那些人相比。可以画一个关系树,就是一棵倒过来的二叉树。bubuko.com,布布扣

以n=3为例,如果1要存活到第3轮,也就是在红色点的位置,他有可能和3,4比赛。同理如果要存活到第4轮,也就是蓝色节点,有可能和5,6,7,8比赛。

确定了哪些人比赛之后,根据公式计算递推即可。初始得分100.

 


 

 

第二题:

题目大意:有n个排成一行的格子,给出m个区间,和每个区间的权w,要求区间里至少有w个格子要种树。求最少的种树总数。 n<=30000,h<=5000;

 

解题过程:

1.这题以前做过了,直接贪心。先按照区间的右端点升序排序,对于任意一个区间,首先必须要满足它的条件,既然肯定要种树,那么就尽量在靠右边的格子填充。

2.具体实现有2种方法。

A:处理每一个区间时,先扫一遍,看看区间里已经有多少树了,在按照上面的贪心原则种下不够的。

B:每种下一棵树,扫一遍所有区间,如果这棵树在某个区间里,把那个区间需要种的树的个数-1;

我用的是方法B,不过时间明显不如方法A。用了2倍多的时间。但是方法A也有弊端,就是如果每个区间的长度都很大就会很慢。

初始得分100;

 


 

 

第三题:

题目大意:

有2个工程AB,每个工程有m个模块,有n个人,每个人完成同一个工程的不同模块耗时一样,分别给出每个人完成工程A和工程B的模块的时间。求最短的总时间能完成2个工程。

 

解题过程:

1.一开始想到用F[i][j][k]表示前i个人,完成了工程A的j个模块,工程B的k个模块的最短时间。状态转移方程也很好写:

F[i][j][k]=min{max(F[i-1][p][q],(j-p)*A[i]+(k-q)*B[i])}; 时间复杂度O(n*m^4);  初始得分60分。比预想的要好了。

2.AC算法:有点类似之前做过的快餐问题。用F[i][j]表示前i个人,完成了工程A的j个模块后最多还能完成多少个工程B的模块,但是时间不知道,所以先二分时间,然后判断F[n][m]>=m是否成立即可。

状态转移方程:F[i][j]=max(  F[i-1][k] + (time-(j-k)*A[i])/B[i]  );

注意初始化一开始要把F[0][0]=0,F[i][j]=-inf,而不是设成0,因为某些状态是永远无法达到的。

 

二模 (2) day1

标签:style   blog   http   2014   问题   sp   log   on   c   

原文地址:http://www.cnblogs.com/vb4896/p/3960401.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!