#15. 钻石
时间:2022-05-08
本文章向大家介绍#15. 钻石,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
钻石
diamond.in/.out/.cpp
【问题描述】
你有 n 个 “量子态” 的盒子,每个盒子里可能是一些钱也可能是一个钻 石。
现在你知道如果打开第 i 个盒子,有P i 100 Pi100 的概率能获得V i Vi 的钱,有1-P i 100 Pi100 的概率能获得一个钻石。
现在你想知道,自己恰好获得 k(0 ≤ k ≤ n) 个钻石,并且获得钱数大 于等于 m 的概率是多少。
请你对 0 ≤ k ≤ n 输出 n+1 个答案。
答案四舍五入保留 3 位小数。
【输入格式】
第一行两个整数 n,m,见题意。
接下来 n 行,每行两个整数 V i Vi , P i Pi 。
【输出格式】
输出共 n+1 行,表示 0 ≤ k ≤ n 的答案。
【样例输入】
2 3
2 50
3 50
【样例输出】
0.250
0.250
0.000
【数据规模和约定】
对于 30% 的数据, n ≤ 10。
对于 60% 的数据, n ≤ 15
对于 100% 的数据,n ≤ 30, 1 ≤ P i Pi ≤ 99, 1 ≤ V i Vi ≤ 10^7 , 1 ≤ m ≤ 10^7 。
【限制】
时间:1s
内存:256M
同样是meet in the middle
为什么差距这么大呢?????
一个20ms+
一个1700ms+
=.=....
1 #include<cstdio>
2 #include<cstring>
3 #include<algorithm>
4 #include<vector>
5 using namespace std;
6 int tt;
7 int n,m;
8 int v[35];
9 double p[35];
10 double ans[35];
11 vector<pair<int,double> > sta[35];
12 int main(){
13
14 scanf("%d%d",&n,&m);
15 for(int i=1,x;i<=n;i++){
16 scanf("%d%d",&v[i],&x);
17 p[i]=x/100.;
18 }
19 for(int i=0;i<=n;i++){
20 sta[i].clear();
21 }
22 int an=(n/2.5)+1;
23 int bn=n-an;
24 for(int st=0;st<1<<bn;st++){
25 double nowp=1;
26 int cnt=0,money=0;
27 for(int i=0;i<bn;i++){
28 if((st>>i)&1){
29 money+=v[n-i];
30 nowp*=p[n-i];
31 }else{
32 cnt++;
33 nowp*=(1-p[n-i]);
34 }
35 }
36 sta[cnt].push_back(make_pair(money,nowp));
37 }
38 for(int i=0;i<=n;i++){
39 sort(sta[i].begin(),sta[i].end());
40 for(int j=1;j<sta[i].size();j++){
41 sta[i][j].second+=sta[i][j-1].second;
42 }
43 }
44 for(int st=0;st<1<<an;st++){
45 double nowp=1;
46 int cnt=0,money=0;
47 for(int i=0;i<an;i++){
48 if((st>>i)&1){
49 money+=v[i+1];
50 nowp*=p[i+1];
51 }else{
52 cnt++;
53 nowp*=(1-p[i+1]);
54 }
55 }
56 for(int i=0;i<=bn;i++){
57 // now d =cnt+i
58 int L = m-money;
59 vector<pair<int,double> >::iterator it = lower_bound(sta[i].begin(),sta[i].end(),make_pair(L,-1.));
60 double tmp = sta[i].back().second;
61 if(it!= sta[i].begin()){
62 it--;
63 tmp-=it->second;
64 }
65 ans[cnt+i] += tmp*nowp;
66 }
67 }
68 for(int i=0;i<=n;i++){
69 printf("%.3fn",ans[i]);
70 }
71 fclose(stdout);
72 return 0;
73 }
1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<cmath>
5 #include<map>
6 #include<algorithm>
7 #define lli long long int
8 using namespace std;
9 const int MAXN=88000;
10 inline void read(int &n)
11 {
12 char c=getchar();n=0;bool flag=0;
13 while(c<'0'||c>'9') c=='-'?flag=1,c=getchar():c=getchar();
14 while(c>='0'&&c<='9') n=n*10+c-48,c=getchar();flag==1?n=-n:n=n;
15 }
16 struct node
17 {
18 int p,v;
19 }box[MAXN];
20 double ans[MAXN];
21 int n,m;
22 int base;// 中间节点
23 struct ANS1
24 {
25 int zuanshi;
26 int qian;
27 double gailv;
28 }ans1[MAXN];
29 int ans1tot=0;
30 struct ANS2
31 {
32 int zuanshi;
33 int qian;
34 double gailv;
35 }ans2[MAXN];
36 int ans2tot=0;
37 void dfs(int num,double gl,int money,int zs)
38 {
39 if(num==base)
40 {
41 ans1[++ans1tot].qian=money;
42 ans1[ans1tot].zuanshi=zs;
43 ans1[ans1tot].gailv=gl;
44 return ;
45 }
46 dfs(num+1,(double)gl*((double)box[num+1].p/100),money+box[num+1].v,zs);
47 dfs(num+1,(double)gl*(double)( 1 - ( (double) box[num+1].p/100) ),money,zs+1);
48 }
49 void dfs2(int num,double gl,int money,int zs)
50 {
51 if(num==n)
52 {
53 ans2[++ans2tot].qian=money;
54 ans2[ans2tot].zuanshi=zs;
55 ans2[ans2tot].gailv=gl;
56 return ;
57 }
58 dfs2(num+1,(double)gl*((double)box[num+1].p/100),money+box[num+1].v,zs);
59 dfs2(num+1,(double)gl*(double)( 1 - ( (double) box[num+1].p/100) ),money,zs+1);
60 }
61 int comp1(const ANS1 &a,const ANS1 &b)
62 {
63 return a.qian<b.qian;
64 }
65 int comp2(const ANS2 &a,const ANS2 &b)
66 {
67 return a.qian>b.qian;
68 }
69 int main()
70 {
71
72 read(n);read(m);
73 base=n/2;
74 for(int i=1;i<=n;i++)
75 {
76 read(box[i].v);
77 read(box[i].p);
78 }
79 dfs(1,(double)box[1].p/100,box[1].v,0);// 钱
80 dfs(1,(double)1-(double)box[1].p/100,0,1);// 钻石
81
82 dfs2(base+1,(double)box[base+1].p/100,box[base+1].v,0);// 钱
83 dfs2(base+1,(double)1-(double)box[base+1].p/100,0,1);// 钻石
84
85 sort(ans1+1,ans1+ans1tot,comp1);
86 sort(ans2+1,ans2+ans2tot,comp2);
87 for(int i=1;i<=ans1tot;i++)
88 {
89 for(int j=1;j<=ans2tot;j++)
90 {
91 if(ans1[i].qian+ans2[j].qian>=m)
92 ans[ans1[i].zuanshi+ans2[j].zuanshi]+=ans1[i].gailv*ans2[j].gailv;
93 else break;
94 }
95 }
96 for(int i=0;i<=n;i++)
97 printf("%.3lfn",ans[i]);
98 return 0;
99 }
- 主备切换的准备工作(r7笔记第83天)
- Java设计模式-外观模式
- Java设计模式-组合模式
- 使用shell批量监控磁盘坏块(二) (r7笔记第80天)
- JavaWeb10-request&response你不得不学(1)
- dg的奇怪问题终结和分区问题答疑 (r7笔记第77天)
- 最近让我焦灼的四个问题(有解) (r7笔记第76天)
- JavaWeb10-reques;response你不得不学(2)
- 很多人比较纠结的约束和索引的关系(r7笔记第75天)
- JavaWeb09-Servlet(Java真正的全栈开发)
- JavaWeb08-XML,tomcat,HTTP轻松入门
- JavaWeb07-JDBC(Java真正的全栈开发)
- 编程思想 之「操作符」
- Hyperledger fabric Chaincode 开发详解
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 不停服务调试(debug)线上Rsyslog
- 使用ulimit 命令、/etc/security/limits.conf、proc 调整系统参数
- 解决jupyter notebook matplotlib绘图中文乱码问题
- 【动手学深度学习笔记】之过拟合与欠拟合实例
- 【数学建模】之Matlab实现BP神经网络
- 【动手学深度学习笔记】之PyTorch实现多层感知机
- 【动手学深度学习笔记】之线性回归实现
- 【动手学深度学习笔记】之多层感知机(MLP)
- 【动手学深度学习笔记】之线性回归
- 【动手学深度学习笔记】之PyTorch实现softmax回归
- 三分钟解决Fashion-MNIST无法下载的问题
- 【动手学深度学习笔记】之实现softmax回归模型
- python实现简单爬虫功能
- Python 爬虫入门—— IP代理使用
- Python爬虫入门:爬取pixiv