CSU 1342:Double

12人阅读 评论(0) 收藏 举报
分类:

题目:

Description

    有一个由M个整数组成的序列,每次从中随机取一个数(序列中每个数被选到的概率是相等的)累加,一共取N次,最后结果能被3整除的概率是多少?

Input

    输入包含多组数据。
    对于每组测试数据,第一行包含两个整数MN (1 <= M <= 100, 1 <= N <= 30),含义同上。接下来一行包含M个在[1, 100]范围内整数,依次描述了这个序列中的各个整数。

Output

    对于每组数据,用“Case XY”的格式输出答案,其中X表示是第几组测试数据(从1开始),Y表示最后结果能被3整除的概率,四舍五入保留8位小数。

Sample Input

2 2
1 2
1 2
4
1 3
4
5 10
4 5 3 1 5

Sample Output

Case 1: 0.50000000
Case 2: 0.00000000
Case 3: 1.00000000
Case 4: 0.33333340

Hint

    这个题目主要是想推荐大家用“double”处理浮点数,而尽量不要用“float”,因为“float”的精度偏低,往往不能满足题目的精度要求,所以在ACM竞赛中索性可以直接使用“double”去处理浮点数问题。“double”用“%lf”控制读入,“%f”控制输出。

    我们先解决一下其他的细节问题再来讨论这个题的思路。

    首先,这个题目也是有多组数据的,但不像“A Sample Problem”那样直接给出了数据的组数,那么要怎么处理呢?这时我们一般采用类似while(scanf(“%d%d”, &M, &N) != EOF){}这样的代码来处理,“!= EOF”是关键,至于他的具体含义就不过多介绍了,总之有了这个框架之后,我们直接在while循环里面写我们处理每组数据的代码就可以了。这时你可能会有这样的疑问:如果这么写代码的话,那么我在手动输入样例的时候怎么才算结束输入呢?Ctrl + Z,然后回车就OK了!

    其次,保留8位小数怎么处理呢?一般在ACM竞赛里面,如果没有明确说明具体怎么处理(比如要用“去尾法”),或者说让“四舍五入”,我们都采用类似printf(“%.8f”, x)的形式保留指定位数的小数。至于使用C++中的cout输出的同学,请自己查阅控制小数位数的相关资料。

    接下来我们就分析这个题目怎么做吧。

    首先,最后能不能被3整除,实际上和最后取出的整数之和(不妨记这个和为“S”)模3的结果有关系。所谓的“模”就是C/C++中的运算符“%”,就是“除以某个数取余”的意思。如果S%3==0,那么就是能被3整除,如果S%3==1或者S%3==2,那么就不能被3整除。也就是说我们要计算的就是S%3==0的概率。

    我们不妨分析一下第四个样例。取十次有点多,我们先取一次看看。

    取一次的话,模3得0的数只有3,所以S%3==0的概率就是0.2(记这个概率为p0),模3得1的数有两个:4和1,所以S%3==1的概率就是0.4(记这个概率为p1),同样的,模3得2的数有两个:5和5,所以S%3==2的概率也是0.4(记这个概率为p2)。

    再分析一下取两次的情况?

    取两次的话S%3==0的概率要怎么算呢?p0*p0 + p1*p2 + p2*p1 = 0.36。这么算的含义是什么呢?因为要保证最后S%3==0,那么如果第一次取出的数模3得0的话,第二次取的数必须也是模3得0,同样的,如果第一次取出的数模3得1的话,那么第二次取出的数必须是模3得2,如果第一次取出的数模3得2的话,那么第二次取出的数必须模3得1。这样我们就得到了上面的式子。同理,我们可以计算S%3==1的概率为p0*p1 + p1*p0 + p2*p2 = 0.32,S%3==2的概率也是0.32。

    再分析一下取三次的情况?

    取三次的话S%3==0的概率应当是0.36*p0 + 0.32*p2 + 0.32*p1。这么算的意义想必大家已经想到了,因为我们要保证最后S%3==0,那么如果前两次取出的数之和模3得0的话,那么第三次取出的数必须也是模3得0,同样的,如果前两次取出的数之和模3得1的话,那么第三次取出的数必须是模3得2,如果前两次取出的数之和模3得2的话,那么第三次取出的数必须是模3得1。同理,我们也很容易写出S%3==1以及S%3==2的概率要怎么算。

    分析到这里想必大家应该已经想到第四次,第五次,一直到第十次要怎么计算了吧?用类似的办法,根据第三次的结果就可以计算出第四次的结果,根据第四次的结果就可以算出第五次的,等等。这样即使一直算到一百次也不成问题!for循环100次就OK了。


其实这个题目可以算是概率DP。

代码估计都差不多,我用了一点空间优化,然而并没有什么区别。

代码:

#include <iostream>
#include<iomanip>
using namespace std;

double p1, p2, p3;
int a, b, c;

void get_p()
{
	int s = a + b + c;
	double x1 = a*p3 + b*p2 + c*p1;
	double x2 = b*p3 + c*p2 + a*p1;
	p3 = (a*p2 + b*p1 + c*p3) / s;
	p2 = x2 / s;
	p1 = x1 / s;
}

int main()
{
	ios_base::sync_with_stdio(false);
	int m, n, i = 1, num;
	while (cin >> m >> n)
	{
		a = 0, b = 0, c = 0;
		while (m--)
		{
			cin >> num;
			if (num % 3 == 1)a++;
			else if (num % 3 == 2)b++;
			else c++;
		}
		p1 = 0, p2 = 0, p3 = 1;
		while (n--)get_p();
		cout << "Case " << i++ << ": " << fixed << setprecision(8) << p3 << endl;
	}
	return 0;
}


查看评论

coj 1342: Double

#include 1342 double p[110][3]; int main() {     int n, m, x, t=0;     while(scanf("%d%d", &m...
  • SHIHAO0711
  • SHIHAO0711
  • 2015-08-13 22:14:56
  • 221

[LightOJ 1342] Aladdin and the Magical Sticks (期望的线性性质+几何分布+邮票收集问题)

LightOJ - 1342 有 N根棍子,每根棍子都有一个权值 其中有若干根可识别的,若干根不可识别的 抽到了可识别的棍子,就不放回,抽到了不可识别的,就要放回 问所有棍子都至...
  • u012015746
  • u012015746
  • 2016-07-31 15:57:06
  • 318

【概率DP】 LightOJ 1342 Aladdin and the Magical Sticks

Vjudge地址:http://acm.hust.edu.cn/vjudge/problem/27050 原题地址: http://lightoj.com/login_main.php?ur...
  • q79186954
  • q79186954
  • 2016-08-07 19:17:38
  • 397

Lightoj 1342(求期望)

链接:点击打开链接 题意:有N根木棍,每根木棍都有一个权值 其中有若干根可识别,若干根不可识别的,抽到了可识别的棍子,就不放回,抽到了不可识别的,就要放回 ,问所有棍子都至少被抽过一次后权值和的期望...
  • stay_accept
  • stay_accept
  • 2016-11-02 13:40:21
  • 256

hdu-1342 Lotto

http://acm.hdu.edu.cn/showproblem.php?pid=1342 题意:以升序的形式给定k个数,输出从中挑选6个数满足升序的所有情况。 思路:两个参数,第一个保存当前搜...
  • u012773338
  • u012773338
  • 2014-09-18 14:46:15
  • 793

CSU_1660_K-Cycle

1660: K-Cycle Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 124  Solved: 31 [Submit][Status][Web ...
  • baidu_29410909
  • baidu_29410909
  • 2015-08-09 17:34:49
  • 309

CSU 1100: 一二三【模拟】

1100: 一二三 Time Limit: 1 Sec  Memory Limit: 128 MB Description 你弟弟刚刚学会写英语的一(one)、二(two)和三(...
  • hurmishine
  • hurmishine
  • 2016-08-16 13:26:17
  • 1171

一二三 CSU - 1100

你弟弟刚刚学会写英语的一(one)、二(two)和三(three)。他在纸上写了好些一二三,可惜有些字母写错了。已知每个单词最多有一个字母写错了(单词长度肯定不会错),你能认出他写的啥吗?   ...
  • aftershowermeow
  • aftershowermeow
  • 2017-02-12 10:02:56
  • 117

CSU/DSU是什么设备

channel service unit/data service unit 想象router是计算机,CSU/DSU是MODEM;就这样联。 ***CSU/DSU不能叫作MODEM***MODE...
  • Galdys
  • Galdys
  • 2011-08-04 16:20:47
  • 903

LightOJ-1342 Aladdin and the Magical Sticks(期望dp)

N - Aladdin and the Magical Sticks  LightOJ - 1342  题解:期望dp。设不可分辨的木棍个数为n1,平均权值为tot1,可分辨的木棍个数...
  • qq_31759205
  • qq_31759205
  • 2017-01-25 16:20:40
  • 293
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 112万+
    积分: 2万+
    排名: 413
    博客专栏