EOJ3055-字符频率

题目

在这里插入图片描述

格式

输入格式
第 1 行:一个整数 T (1≤T≤10) 为问题数。
对于每个问题,有 2 行数据,按如下格式输入:
第 1 行输入 26 个浮点数,分别表示 26 个英文字母 A(a)~Z(z) 的使用频率;
第 2 行输入一个字符串,字符串长度不超过 100 个字符,字符串由 26 个英文字母构成。

输出格式
对于每个问题,输出一行问题的编号(0<开始编号,格式:case #0: 等)。
然后对应每个问题在一行中输出重排后的字符串。

示例

input
3
8.19 1.47 3.83 3.91 12.25 2.26 1.71 4.57 7.10 0.14 0.41 3.77 3.34 7.06 7.26 2.89 0.09 6.85 6.36 9.41 2.58 1.09 1.59 0.21 1.58 0.08
Thisisaexample
8.19 1.47 3.83 3.91 12.25 2.26 1.71 4.57 7.10 0.14 0.41 3.77 3.34 7.06 7.26 2.89 0.09 6.85 6.36 9.41 2.58 1.09 1.59 0.21 1.58 0.08
AertrtsaBereDET
8.19 1.47 3.83 3.91 12.25 2.26 1.71 4.57 7.10 0.14 0.41 3.77 3.34 7.06 7.26 2.89 0.09 6.85 6.36 9.41 2.58 1.09 1.59 0.21 1.58 0.08
Thequickbrownfoxjumpsoverthelazydog

output
case #0:
eeTaaiisshlmpx
case #1:
eeeEttTaArrrsDB
case #2:
eeetTaooooinrrshhdclmpuufgwybvkxjqz

code

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
//如果cmp函数中要用到这个,可以写成全局函数!!
double fre[26];
char str[105];

//1. 如果是大小写,a>b
//2. 如果是频率一样,字母不一样,a<b
//3. 如果都不一样,比较频率
bool cmp(char a, char b) {
	double frea, freb;
	if (tolower(a) == tolower(b)) return a > b;
	frea = fre[tolower(a) - 'a'];
	freb = fre[tolower(b) - 'a'];
	if (frea == freb) return (a < b);
	return frea > freb;
}
int main() {
	int n, i, j;
	cin >> n;
	for (i = 0; i < n; i++) {
		for (j = 0; j < 26; j++)  scanf("%lf", &fre[j]);//输入频率
		      
		scanf("%s", str);
		sort(str, str + strlen(str), cmp);
		
		cout << "case #" << i << ":" << endl;
		printf("%s",str);
		cout << endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Caiyii530/article/details/105738728