HDU 4811 Ball(贪心)

2014-05-15 22:02 by Jeff Li

前言

  系列文章:[传送门]

  马上快要期末考试了,为了学点什么。就准备这系列的博客,记录复习的成果。

     

正文-计数  

概率

  概率论研究随机事件。它源于赌徒的研究。即使是今天,概率论也常用于赌博。随机事件的结果是否只凭运气呢?高明的赌徒发现了赌博中的规律。尽管我无法预知事件的具体结果,但我可以了解每种结果出现的可能性。这是概率论的核心。

  “概率”到底是什么?这在数学上还有争议。“频率派”认为概率是重复尝试多次,某种结果出现的次数在尝试的总次数的比例。“贝叶斯派”认为概率是主观信念的强弱。幸好,这些争议并不影响我们在日常生活中使用“概率”哲学。天气预报的降雨概率为80%时,很多人会因此带上伞。报纸会分析一场球赛某支球队的赢球概率,如果最终赢球概率为10%的球队取胜,那么球迷会感到惊讶。这结果是小概率事件。

  要知道某个结果的概率并不容易。上面分析球队的赢球概率,要考虑许多因素。投一个骰子,有6种可能的结果。物理情况会影响结果的概率,比如撒子是否均匀,比如掷撒子的人是否有技巧偏向。如果骰子是均匀的,且没有作弊,那么每种结果出现的概率相同。为了能从数学上给结果分配一个概率,我们往往会加上一些假设。这些假设有理想化的成份,但并不至于偏离现实。比如,我们说掷撒子,撒子均匀,掷的人也没有什么特殊手法,并由此推断每种结果出现的可能相同。那么,其中任意一个结果出现的概率为1/6。

                              

                     

基本计数原理

计数的基本原理叙述如下:

  如果一个实验可以分为m个步骤,每个步骤分别有n1,n2,...,nm种可能,那么总共会下面
有种可能的结果。

n1×n2×...×nm

  基本技术原理的核心是“分步”。对于简单的一个步骤的事情,我们能比较直接的分辨结果的总数。

有序的重复抽样

  从数学上来说,如果进行m次有放回的抽样,每次抽样都有n种可能。如果最终结果有序,那么将有nm种可能。

考虑下面的问题:

  • 一个骰子连续掷2次,所有可能的结果有多少个?

模拟例子:(python系列文章)

import itertools

a = [1, 2, 3, 4, 5, 6]
outcomes = list(itertools.product(a, a))

print(outcomes)
print(len(outcomes))

#itertools 相关文档

会有下面的结果:

[(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6),
 (2, 1), (2, 2), (2, 3), (2, 4), (2, 5), (2, 6),
 (3, 1), (3, 2), (3, 3), (3, 4), (3, 5), (3, 6),
 (4, 1), (4, 2), (4, 3), (4, 4), (4, 5), (4, 6),
 (5, 1), (5, 2), (5, 3), (5, 4), (5, 5), (5, 6),
 (6, 1), (6, 2), (6, 3), (6, 4), (6, 5), (6, 6)]

36

#所以出现的概率P=1/36。

有序的非重复抽样

  有序的非重复抽样又叫做排列(permutation)。从数学上来说,从n个样品中挑选m个,放入m个位置,将有n×(n?1)×...×(n?m+1)种可能。如果我们使用阶乘(factorial)运算符,那么结果可以表示为

 n!(n?m)!

#其中,n!=1×2×...×(n?1)×n。

考虑下面的问题:

我们用下面的程序来模拟队长组合的状况:

import itertools

a = ["Tom", "Lee", "King", "James"]
outcomes = list(itertools.permutations(a, 2))

print(outcomes)
print(len(outcomes))

相关文档

结果为

[(‘Tom‘, ‘Lee‘), (‘Tom‘, ‘King‘), (‘Tom‘, ‘James‘),
 (‘Lee‘, ‘Tom‘), (‘Lee‘, ‘King‘), (‘Lee‘, ‘James‘),
 (‘King‘, ‘Tom‘), (‘King‘, ‘Lee‘), (‘King‘, ‘James‘),
 (‘James‘, ‘Tom‘), (‘James‘, ‘Lee‘), (‘James‘, ‘King‘)]

#共有12种可能的结果。

无序的非重复抽样

  m个样品有m!种排列方式。如果是从n个样品中抽取m个作为组合,所有的这m!种排序方式应该看做一种。因此,有n!(n?m)!m!种可能结果。我们可以用下面的方式记录组合:

(nm)=n!(n?m)!m!

考虑下面的问题:

  • 从4个人中抽出2个人,有多少种可能?

下面来模拟:

import itertools

a = ["Tom", "Lee", "King", "James"]
outcomes = list(itertools.combinations(a, 2))

print(outcomes)
print(len(outcomes))

#相关文档

有以下结果

[(‘Tom‘, ‘Lee‘), (‘Tom‘, ‘King‘), (‘Tom‘, ‘James‘),
 (‘Lee‘, ‘King‘), (‘Lee‘, ‘James‘),
 (‘King‘, ‘James‘)]

#可以看到,从4个中挑选2个,有6种可能的组合。这是排列的一半。

无序的重复抽样

概括来讲,从n个样品中,无序的重复抽样m次,有

(n+m?1m?1)

阶乘与组合

我们在上面多次使用了阶乘运算,在Python中,它可以使用math.factorial实现:

import math
print(math.factorial(5))

总结

  

  基本计数原理

  排列

  组合

  (生活离不开寻找数学,你说呢?)

  

感谢及资源共享

    

    路上走来一步一个脚印,希望大家和我一起。

    感谢读者!很喜欢你们给我的支持。如果支持,点个赞。

    知识来源: 概率论等书 和 python api

HDU 4811 Ball(贪心),布布扣,bubuko.com

时间: 2024-12-30 19:01:01

HDU 4811 Ball(贪心)的相关文章

hdu 4811 Ball(数学)

题目链接:hdu 4811 Ball 题目大意:有三种颜色的球若干,每次向桌子上放一个球,保证是一条序列,每次放球的得分为当前放入序列的球的前面有多少种不同的颜色a,后面的有多少种不同的颜色b,a+b.问说给定球的数量后,最大得分为多少. 解题思路:因为放球顺序是自己定的,所以我们可以尽量早得构造一个序列,使得后面放入球的得分均保持在峰值.那么求峰值就要根据球的数量来决定.我们叫得分为峰值的求为最高得分球,它们有很多个.对于一种颜色来说:0个,表示不能为在最高得分球的左边和右边,换句话来说,就是

hdu 5821 Ball (贪心)

Ball Description ZZX has a sequence of boxes numbered 1,2,...,n. Each box can contain at most one ball. You are given the initial configuration of the balls. For 1 \leq i \leq n, if the i-th box is empty then a[i]=0, otherwise the i-th box contains e

[思路] hdu 4811 Ball

题意: 有三种颜色的小球,每种颜色数量R,Y,B 依次把球放到桌面上成一个序列,每次得分为这个球前面有多少种不同颜色的球+后面有多少种不同颜色的球 问总得分的最大值 思路: 构造前面的球和后面的球先放好,剩下的就放中间了 代码: #include"cstdlib" #include"cstdio" #include"cstring" #include"cmath" #include"queue" #incl

hdu 4869 Task(贪心)

题目链接:hdu 4869 Task 题目大意:有n台机器,m个任务,每个机器和任务都有有xi和yi,要求机器的xi,yi均大于等于任务的xi和yi才能执行任务.每台机器一天只能执行一个任务.要求完成的任务数尽量多,并且说金额尽量大.完成每个任务的金额为xi?500+yi?2 解题思路:贪心,mach[i][j]表示等级为i,时间为j的机器数量,task[i][j]表示等级为i,时间为j的机器数量.每次优先减少i,因为对应等级减少100,对应的金额代价也不会减少超过500(即时间减少1). 每次

HDU 4864 Task(贪心)

HDU 4864 Task 题目链接 题意:有一些机器和一些任务,都有时间和等级,机器能做任务的条件为时间等级都大于等于任务,并且一个任务只能被一个机器做,现在求最大能完成任务,并且保证金钱尽量多 思路:贪心,对于每个任务,时间大的优先去匹配,时间相同的,等级大的优先去匹配,因为时间占得多,时间多1就多500,而等级最多才差200.然后匹配的时候,尽量使用等级小的去匹配,而时间只要大于它的都可以用,因为是按时间优先,所以如果该时间能匹配大的,其他肯定也能匹配,那么肯定优先匹配大的,所以只要在等级

HDU 4912 LCA+贪心

Paths on the tree Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 531    Accepted Submission(s): 182 Problem Description bobo has a tree, whose vertices are conveniently labeled by 1,2,…,n. Th

HDU 1661 Assigments 贪心法题解

Problem Description In a factory, there are N workers to finish two types of tasks (A and B). Each type has N tasks. Each task of type A needs xi time to finish, and each task of type B needs yj time to finish, now, you, as the boss of the factory, n

2014多校第一场D题 || HDU 4864 Task (贪心)

题目链接 题意 : 用N台机器,M个任务,每台机器都有一个最大工作时间和等级,每个任务有一个需要工作时间和一个等级.如果机器完成一个任务要求是:机器的工作时间要大于等于任务的时间,机器的等级要大于等于任务的等级.一台机器只能完成一个任务,一个任务只能被一台机器完成.每个机器完成一个任务公司能够获得500*xi+2*yi (此处xy都是指被完成的任务的).输出所有机器能完成的最多任务数,和最大盈利. 思路 :贪心,自己做的时候想了各种排序都不对,没有考虑到500*xi+2*yi 这个公式的重要性.

hdu 4898 LCP+贪心思维

题意:将一个字符串切成k块,使得字典序最大的那块最小. ORZ  WJMZBMR,几行题解读了一天才懂. 快速比较两个子串的大小可以利用LCP(最长公共前缀),比较公共前缀的下一个字符的大小就够了. 利用这种思想,首先我们可以预处理所有子串的LCP(后缀数组+记录 O(2nlog(2n))+O(n*n),dp(O(4*n*n))) 然后将这些子串利用LCP按照字典序排序,开始二分答案. 二分的答案就是这K个块字典序的上限.假设以i作为起点,由于字典序上限已知,所以我们可以立刻求出i点最远能选到哪