Password Hacking CSU 1966

Description

We all know that passwords are not very secure unless users are disciplined enough to use passwords that are difficult to guess. But most users are not so careful, and happily use passwords such as “123456”. In fact, there are lists of commonly used passwords that hackers can use for breaking into systems, and these passwords often work.

You have done a lot of hacking using such lists, and you have a good idea of how likely each password in the list is the correct one (you are very surprised by the number of people using “123456” as their passwords). You have a new account to hack, and you have decided to try each of the passwords in the list one at a time, until the correct one is found. You are absolutely sure that the account you want to hack uses a password in the given list.

What is the expected number of attempts to find the correct passwords, assuming that you try these passwords in the optimal order?

Input

The first line of input contains a positive integer N, the number of passwords in the list. Each of the next N lines gives the password, followed by a space, followed by the probability that the password is the correct one. Each password is a non-empty string consisting only of alphanumeric characters and is up to 12 characters long. Each probability is a real number with 4 decimal places. You may assume that there are at most 500 passwords in the list, and that the sum of all probabilities equals 1. No two passwords in the list are the same.

Output

Output on a single line the expected number of attempts to find the correct passwords using the optimal order. Answers within 10−4 of the correct answer will be accepted.

Sample Input

2
123456 0.6666
qwerty 0.3334

3
qwerty 0.5432
123456 0.3334
password 0.1234

Sample Output

1.3334
1.5802

Hint

Source

2017湖南多校第十三场

水题,不解释。

代码如下:

/* Author:kzl */
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<string>
using namespace std;
char ch[20];
double cun[550];
int n;
int main(){
while(scanf("%d",&n)!=EOF)
{
    for(int i=0;i<n;i++){
         scanf("%s",ch);scanf("%lf",&cun[i]);
    }
    double sum = 0;
    sort(cun,cun+n);
    for(int i=n-1;i>=0;i--)
{
    sum += cun[i] * (n-i);
}
printf("%.4lf\n",sum);
}
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值