淘汰赛制

递推

【问题描述】

淘汰赛制是一种极其残酷的比赛制度。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. 本地不安装oracle-client,使用pl/sql developer连接数据库

    一.问题描述 本地未安装oracle-client端,由于机器资源有限,希望通过pl/sql developer进行远程数据库连接.单纯的安装pl/sql developer无法远程连接数据库. 二. ...

  2. c++ 钻石继承

    在C++中,什么叫做钻石问题(也可以叫菱形继承问题),怎么避免它? 下面的图表可以用来解释钻石问题. 假设我们有类B和类C,它们都继承了相同的类A.另外我们还有类D,类D通过多重继承机制继承了类B和类 ...

  3. hibernate里createSQLQuery

    一.addEntity()和setResultTransformer()方法 1. 使用SQLQuery 对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行Session.creat ...

  4. 01-04-03【Nhibernate (版本3.3.1.4000) 出入江湖】Criteria API关联查询

    Criteria API关联查询 如果说HQL查询还有需要了解点SQL语法知识,并不是完全彻底面向对象查询, 那么Criterial API就是完全面向对象的查询方式. public IList< ...

  5. 关于JS及应用程序开发的一些体会

    代码通常从 一,生命周期 二,业务流程 这几方面来看. JS Client可以和Server端分离. JS端的生命周期. Server端就是 JS能处理的只是HTTP协议.

  6. Robot Framework 环境搭建

    一.下载软件 1.安装Python 到官网,下载Python 2.7.9:https://www.python.org/downloads/,最好选择32位版本的(64位系统也支付32位版本),然后安 ...

  7. Splay树再学习

    队友最近可能在学Splay,然后让我敲下HDU1754的题,其实是很裸的一个线段树,不过用下Splay也无妨,他说他双旋超时,单旋过了,所以我就敲来看下.但是之前写的那个Splay越发的觉得不能看,所 ...

  8. POJ 1182 食物链(种类并查集)

    记得第一次做这道题的时候,推关系感觉有点复杂,而且写完代码后一直WA,始终找不出错误. 在A了十几道并查集后,再做这道题,发现太小儿科了.发现原来之所以WA,就在于查找根节点时,没有同步更新子节点相对 ...

  9. hdu 2481 Toy

    好题!!!没话说…… 用到的知识面很多,这题的难点在于公式的推导. 原始推导过程见:http://hi.baidu.com/spellbreaker/item/d8bb3bda5af30be6795d ...

  10. 什么是spring?

    一.对spring的理解. 1.Spring是实现了工厂模式的工厂类(什么是工厂类?简单的来说就是把需要的接口定义到一个类中,需要的时候不用新建,直接从这个类中调用该接口就可以了), 这个类的名字为B ...