打字 (SDUT 3923 贪心)

Description

snow 是个热爱打字的家伙,每次敲出更快的速度都会让他很开心。现在,他拿到一篇新的打字文章,已知这篇文章只有 26 个小写英文字母,给出 snow 打出这 26 个英文字母分别需要多少时间 (s),问 snow 打完这篇文章获得的 kpm(打正确的字数/所花的分钟数)最大为多少?

注意 snow 可能会打错一些字哦。打错的必定是文章里面存在的。

Input

多组输入。

对于每组数据,首先输入 26 个整数,分别表示打出 a, b, c, ..., z 这 26 个字母需要的时间(保证是 int 范围内的正整数),然后给出一个字符串,长度不超过 1000,保证只包含小写英文字母。

Output

对于每组数据,输出一行,表示最大的 kpm,保留 2 位小数。

Sample Input

1 2 2 1 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
abcd
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
abcd

Sample Output

40.00
25.71

题解:就是将已有字符串按权重排序(从大到小),然后逐渐将用时多的字母替换用时少的,并算出每个阶段的kpm取出最大值

代码如下:

#include <iostream>
#include <cstdio>
#include <stdlib.h>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <string.h>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <ctime>
#define maxn 10007
#define N 100005
#define INF 0x3f3f3f3f
#define PI acos(-1)
#define lowbit(x) (x&(-x))
#define eps 0.000000001
#define read(x) scanf("%d",&x)
#define put(x) printf("%d\n",x)
#define Debug(x) cout<<#x<<"="<<x<<" "<<endl
using namespace std;
typedef long long ll;
int main()
{
    int a[26];
    while(cin>>a[0])
    {
        for(int i=1; i<26; i++)
            cin>>a[i];
        char s[1111]= {0};
        cin>>s;
        int l=strlen(s);
        int b[1111]= {0},minn=INF;
        for(int i=0; i<l; i++)
        {
            b[i]=a[s[i]-'a'];
            minn=min(minn,b[i]);
        }
        sort(b,b+l);
        double ans=0,sum=0;
        for(int i=0; i<l; i++)
        {
            sum+=b[i];
            ans=max(ans,double(i+1)/(sum+double(l-i-1)*minn));
        }
        printf("%.2lf\n",ans*60.0);
    }
}

猜你喜欢

转载自blog.csdn.net/baiyi_destroyer/article/details/81159311