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最高....
要么是打错零个,要么是打错一个,要么是打错三个......
如果需要打错字的话,肯定是将耗时多的字打错,会提高kpm,所以从后向前遍历一遍就好了。
还需要注意一点,前缀和数组的应用。
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #include<math.h> 5 #include<algorithm> 6 #include<queue> 7 #include<stack> 8 #include<deque> 9 #include<iostream> 10 using namespace std; 11 typedef long long LL; 12 struct cha 13 { 14 char c; 15 int time; 16 } cha[1009]; 17 int con[200]; 18 char day[1009]; 19 bool cmp(struct cha a,struct cha b) 20 { 21 if(a.time==b.time) 22 return a.c<b.c; 23 return a.time<b.time; 24 } 25 int main() 26 { 27 int i,p,j; 28 char mid; 29 double min1,x; 30 while(scanf("%d",&con['a'])!=EOF) 31 { 32 for(i='b'; i<='z'; i++) 33 scanf("%d",&con[i]); 34 p=-1; 35 getchar(); 36 gets(day); 37 for(i=0; i<=1008; i++) 38 { 39 if(day[i]==0) 40 break; 41 else 42 { 43 cha[++p].c=day[i]; 44 cha[p].time=con[day[i]]; 45 } 46 } 47 sort(cha,cha+p+1,cmp); 48 49 for(i=0; i<=p; i++) 50 cha[i].time+=cha[i-1].time; 51 52 min1=((double)(p+1)/cha[p].time)*60; 53 for(i=p-1; i>=0; i--) 54 { 55 x=(double)(i+1)/(cha[i].time+(cha[0].time*(p-i)))*60; 56 if(x>min1) 57 min1=x; 58 } 59 printf("%.2lf ",min1); 60 } 61 return 0; 62 63 }