淘汰赛制

递推

【问题描述】

淘汰赛制是一种极其残酷的比赛制度。2^n名选手分别标号1,2,3,…,2^n-1,2^n,他们将要参加n轮的激烈角逐。每一轮中,将所有参加该轮的选手按标号从小到大排序后,第1位与第2位比赛,第3位与第4位比赛,第5位与第6位比赛……只有每场比赛的胜者才有机会参加下一轮的比赛(不会有平局)。这样,每轮将淘汰一半的选手。n轮过后,只剩下一名选手,该选手即为最终的冠军。

现在已知每位选手分别与其他选手比赛获胜的概率,请你预测一下谁夺冠的概率最大。

【输入】

第一行是一个整数n(l≤n≤l0),表示总轮数。接下来2^n行,每行2^n个整数,第i行第j个是pij(0≤pij≤100,pii=0,pij+pji=100),表示第i号选手与第j号选手比赛获胜的概率。

【解题过程】

首先要搞清楚一个问题:如何计算某个人在某一轮的获胜概率?每个人的对手是谁有很多种可能,一开始我以为是取所有中的最大,但其实是加起来,所以后来 WA 了很久。

然后很明显是递推。我自己用了一个很无脑的递推:用 f(k, i, j) 表示“在第 k 轮 i 与 j 比赛并胜出”的概率,则

f(k, i, j) = sum{ sum{f(k-1, i, x)}*sum{f(k-1, j, y}*p(i, j) }

边界状态 f(1, i, j) = p(i, j)

这个算法复杂度相当高,大约是 O(n*(2^n)^4)。

可以看出上面的每次递推都要求和,那么干脆保存和吧。所以用 f(k, i) 表示“在第 k 轮 i 胜出”的概率,则

f(k, i) = sum{ f(k-1, j)*f(k-1, i)*p(i, j) }

边界状态 f(0, i) = 1

初始得分 20 分。

种树

贪心或差分约束

【问题描述】

一条街的一边有几座房子。因为环保原因居民想要在路边种些树。路边的地区被分割成块,并被编号为l…n。每个块的大小为一个单位尺寸并最多可种一棵树。每个居民想在门前种些树并指定了三个号码b,e,t。这三个数表示该居民想在b 和e 之间最少种t 棵树。当然,b≤e,居民必须保证在指定地区不能种多于地区被分割成块数的树,即要求t≤e-b+1,允许居民想种树的各自区域可以交叉。出于资金短缺的原因,环保部门请你求出能够满足所有居民的要求,需要种树的最少数量。

【输入】

第一行为n,表示区域的个数;第二行为h,表示房子的数目;下面h 行描述居民的需要:b,e,t(0<b≤e≤30000,r≤e-b+l)分别用一个空格分开。

【解题过程】

很明显的贪心,先对区间按照右端点的大小升序排序,然后每次从区间的最右边往左覆盖即可,这样就能保证“共用”的树最多,总数最少。

初始得分 10 分,因为把排序方式搞成了按照左端点排序。

软件开发

二分答案+动态规划

【问题描述】

一个软件开发公司同时要开发两个软件,并且要同时交付给用户,现在公司为了尽快完成这一任务,将每个软件划分成m 个模块,由公司里的技术人员分工完成,每个技术人员完成同一软件的不同模块的所用的天数是相同的,并且是已知的,但完成不同软件的一个模块的时间是不同的,每个技术人员在同一时刻只能做一个模块,一个模块只能由一个人独立完成而不能由多人协同完成。一个技术人员在整个开发期内完成一个模块以后可以接着做任一软件的任一模块。写一个程序,求出公司最早能在什么时候交付软件。

【输入】

输入文件第一行包含两个由空格隔开的整数n和m,其中1≤n≤100,1≤m≤100。接下来的n行每行包含两个用空格隔开的整数d1和d2,d1表示该技术人员完成第一个软件中的一个模块所需的天数,d2表示该技术人员完成第二个软件中的一个模块所需的天数,其中l≤d1,d2≤100。

【解题过程】

一开始没有任何思路。

然后经过分析可以知道,只需要关心每个人各完成了软件 1 和 2 的多少模块即可。

然后想到二分答案,那么如何判断在某个时间内能否完成所有任务呢?

这里想到 HNOI’99 的快餐问题,然后就发现状态的表示什么的都几乎一样:用 f(i, j) 表示在某规定的时间内,前 i 个人一共完成 j 个软件 1 的模块之后最多能完成多少个软件 2 的模块,那么对第 i 个人完成了多少软件 1 的模块进行枚举即可。

假设规定的时间为 k,那么

f(i, j) = max{ f(i-1, j-x)+(k-x*cost1[i])/cost2[i] }

其中 x 表示第 i 个人完成的软件 1 的模块数。

然后就可以二分答案了。

初始得分 100 分。

02day1的更多相关文章

  1. 二模02day1解题报告

    T1.淘汰赛制 比赛时的淘汰赛制,给出每两个球队比赛的胜率,求出最终胜率最高的队伍. 这题的概率真的很难算啊感觉...一开始打的代码打下来就是用f[i][j]表示i场比赛后第j人还在场的概率.不难看出 ...

  2. 2模02day1题解

    源文件在我的网盘上.链接:http://pan.baidu.com/s/1qWPUDRm 密码:k52e (只有机智的人才能看到我的链接) 机智的双重下划线~~~ T1 T1就是一个递推,这题目把我恶 ...

随机推荐

  1. WSDL 文档解析

    学习webservice,就离不了WSDL文档,他是我们开发WebService的基础,虽说,现在现在有许多WebService的开源框架使得我们可以根据WSDL生成客户端代码,但是,了解WSDL文档 ...

  2. 用hibernate自动创建mysql表,添加失败org.hibernate.exception.SQLGrammarException

    今天遇到了一个很坑人的问题,从昨晚一直搞到今天早上,终于发现了,先整理下: [背景]:利用hibernate自动给mysql创建一个表,然后为表里面添加一行记录,非常的简单(当然其中还涉及到sprin ...

  3. specular map normal map gloss map

    http://www.marmoset.co/toolbag/learn/materials http://digitalerr0r.wordpress.com/2009/03/26/xna-shad ...

  4. PHP的反射机制(转)

    介绍: PHP5添加了一项新的功能:Reflection.这个功能使得phper可以reverse-engineer class, interface,function,method and exte ...

  5. SVN库实时同步设置

    为了安全起见,SVN服务器除了做定时全量备份和增量备份以外,如条件允许,可做实时备份. 这需要2台机器,一台是master server,另一台做mirror server.master做主服务,mi ...

  6. 【面试题030】最小的k个数

    [面试题030]最小的k个数 题目:     输入n个整数,找出其中最小的k个数.     例如输入4.5.1.6.2.7.3.8这8个字,则其中最小的4个数字是1.2.3.4.     思路一:   ...

  7. java基础知识回顾之---java String final类普通方法的应用之“子串在整串中出现的次数”

    /* * 2 一个子串在整串中出现的次数. * "loveerlovetyloveuiloveoplove" * 思路: * 1,要找的子串是否存在,如果存在获取其出现的位置.这个 ...

  8. JDK8 学习

    http://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html

  9. hdu 4579 Random Walk 概率DP

    思路:由于m非常小,只有5.所以用dp[i]表示从位置i出发到达n的期望步数. 那么dp[n] = 0 dp[i] = sigma(dp[i + j] * p (i , i + j)) + 1 .   ...

  10. springmvc环境的搭建

    最近应公司要求,用了2天时间学了springmvc的搭建,就简单总结一下: springmvc和struts2的比较,因为我是学过struts的,它们都是基于mvc模式而设计的web层框架 它们最大的 ...