The secret code
The secret code
Input file: stdinOutput file: stTime limit: 1 sec
Memory limit: 256 Mb
After returning from the trip, Alex was unpleasantly surprised: his porch door had a new combination lock. Alex
can not get into his house! Code lock contains N disks, each of which can be in one of M positions. There
is only one correct position. Alex thoroughly inspected discs and by fingerprints and scratches determined the
probability of each position for each disk. Now Alex has K attempts to guess the correct code: if he fails, his
vigilant neighbors will call the police, and Alex will have a hard time persuading cops that he is not a thief, but
tried to get home. Help Alex to calculate the maximum probability of getting home, not to the police.
Limit
1 ≤ N ≤ 100
1 ≤ M ≤ 20
1 ≤ K ≤ 100
0 ≤ P ij ≤ 100
Input
The first line of input file contains three integers: N, M Рё K.
Next N lines contain M integers each: j-th number of the i-th line (P ij ) — the probability of a situation where
i-th disc’s correct position is j. Given that
P M
j=1 P ij
= 100.
Output
Print a single number — Alex’s chances to guess the correct code in time. Output result should have an absolute
percentage error not grater than 10 −7 .
Example
stdin
2 2 1
50 50
10 90
3 5 4
10 15 20 25 30
1 2 3 4 90
100 0 0 0 0
stdout
0.45
0.81
题目大意:
n个数列,每个数列取一个数,得到这些数的乘积,求前k个最大的乘积。
多谢syx的指导!
解题思路:
对每个数列排序后。
首先,第一大的自然是所有数列最大值乘积。
接着,将最大乘积加到ans上,然后将这个乘积能够达到的所有下一个状态均加入优先队列中。至于保存状态,每个状态只需保存其在每个数列的取到第几个数的指针即可,显然下一个状态是在该状态之后,并且出现在某一个指针向后移位。故将所有下一个状态加入优先队列。
然后,当找到第k个或者是空队列时退出循环,否则返回上一步。
最后,输出答案。
实现方法,直接使用STL中的priority_queue,若数据量加大,可惜优先队列不能删除尾节点,不过可利用最大最小堆保存前k个即可。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <utility>
#include <stack>
#include <queue>
#include <map>
#include <deque>
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)<(y)?(x):(y)) using namespace std; struct State{
int head[];
double x;
bool operator<(const State &b) const
{
return x<b.x;
}
}; double a[][];
int n,m,k;
priority_queue<State> q;
bool cmp(double x, double y)
{
return x>y;
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
for(int i=; i<n; i++)
{
for(int j=; j<m; j++)
{
scanf("%lf",&a[i][j]);
a[i][j]/=;
}
sort(a[i],a[i]+m,cmp);
} State tmp;
tmp.x=1.0;
for(int i=; i<n; i++)
{
tmp.head[i]=;
tmp.x*=a[i][];
}
q.push(tmp); double ans=0.0;
for(int i=; i<k&&!q.empty(); i++)
{
tmp=q.top();
q.pop();
ans+=tmp.x;
for(int j=; j<n; j++)
if(tmp.head[j]<m-)
{
if(a[j][tmp.head[j]+]==) continue;
tmp.x=tmp.x / a[j][tmp.head[j]] * a[j][tmp.head[j]+];
tmp.head[j]++;
q.push(tmp);
tmp.x=tmp.x / a[j][tmp.head[j]] * a[j][tmp.head[j]-];
tmp.head[j]--;
}
} printf("%.8f\n",ans);
return ;
}
The secret code的更多相关文章
- Android Secret Code
我们很多人应该都做过这样的操作,打开拨号键盘输入*#*#4636#*#*等字符就会弹出一个界面显示手机相关的一些信息,这个功能在Android中被称为android secret code,除了这些系 ...
- hdu.1111.Secret Code(dfs + 秦九韶算法)
Secret Code Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...
- Android 编程下的 Secret Code
我们很多人应该都做过这样的操作,打开拨号键盘输入 *#*#4636#*#* 等字符就会弹出一个界面显示手机相关的一些信息,这个功能在 Android 中被称为 Android Secret Code, ...
- [swustoj 679] Secret Code
Secret Code 问题描述 The Sarcophagus itself is locked by a secret numerical code. When somebody wants to ...
- 洛谷 P3102 [USACO14FEB]秘密代码Secret Code 解题报告
P3102 [USACO14FEB]秘密代码Secret Code 题目描述 Farmer John has secret message that he wants to hide from his ...
- HDU 1111 Secret Code(数论的dfs)
Secret Code Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit ...
- Secret Code
Secret Code 一.题目 [NOIP模拟赛A10]Secret Code 时间限制: 1 Sec 内存限制: 128 MB 提交: 10 解决: 6 [提交][状态][讨论版] 题目描述 ...
- 【微信】根据appid, secret, code获取用户基本信息
function getUserInfo(){ $appid = "yourappid"; $secret = "yoursecret"; $code = $_ ...
- 洛谷P3102 [USACO14FEB]秘密代码Secret Code
P3102 [USACO14FEB]秘密代码Secret Code 题目描述 Farmer John has secret message that he wants to hide from his ...
随机推荐
- Linux下卸载和安装MySQL[rpm包]
一.卸载原来的mysql: 卸载一: 输入: #rpm -qa | grep -i mysql 显示: mysql-libs-5.1.52-1.el6_0.1.i686 卸载方法: yum -y re ...
- eclipse 配置git ssh登录
实现需要安装git的插件,由于我使用的adt和eclipse for javaee版本两个,都已经安装了git插件,就不再演示了,网上都有. 这篇文章主要是介绍使用ssh进行认证的方式. 1.首先,配 ...
- vs2008中使用正则删除空行
起因 今天下了段代码复制到VS2008中想好好学习下,结果发现每隔一行都有一行空白行(如下图),如果只有几行么手动删下就好了,但是这边估计有几百行,我也不知道VS2008有没有什么支持快速删除空白行的 ...
- Linux 命令整理 —— 用户管理
Linux用户管理以读.写.执行动作为权限,以用户组为单位,限制用户行为.对于文件的的操作,可以限制读.写.执行中的哪一种,也可以限制文件所有者.组用户.组外用户相应的权限. 所以,要建立用户,最好先 ...
- C#根据日期DateTime和持续时间int找到日期
protected DateTime GetFinish(DateTime start, int duration) { return start.AddDays(duration); } prote ...
- centos6.5安装vmware-tools
一.问题描述 为什么使用vmware-tools:传文件方便,可以从主机中直接拖拽文件到centos中(但实际上我们可以用:WinSCP):鼠标切换方便,鼠标指到什么地方,表名当前正在操作哪个环境(但 ...
- 使用函数的递归调用来解决Hanoi(汉诺)塔问题。
#include<stdio.h> void hanoi(int n, char x, char y, char z); void move(char x, char y); int ti ...
- hdu 1166 树状数组 线段树入门
点修改 区间求和 #include <cstdio> #include <cstdlib> #include <cmath> #include <map> ...
- uva 534
floyd算法 数据量比较小 就简单了~ /************************************************************************* > ...
- Unity3D研究院之打开Activity与调用JAVA代码传递参数
原地址:http://www.xuanyusong.com/archives/667 Unity for Android 比较特殊,Unity for IOS 打包是将XCODE工程直接交给开发 ...