描述 | |
---|---|
知识点 | 字符串 |
运行时间限制 | 0M |
内存限制 | 0 |
输入 | 整数N,后续N个名字 N个字符串,每个表示一个名字 |
输出 | 每个名称可能的最大漂亮程度 |
样例输入 | 2 zhangsan lisi |
样例输出 | 192 101 |
解题思路,统计字符串里面字符出现的次数,按次数排序,字符依次乘以26、25、24、23。。。
方法一:直接使用数组来存不同字母出现的次数count[alpha]++。
方法二:使用map,将char型与int行对应起来
#include<iostream>
#include<string>
#include<vector>
#include<map>
#include<cctype>
#include<algorithm>
using namespace std;
void shellsort(int *str,int len)
{
int d=len/2,i,j;
int temp;
for(d;d>=1;d/=2)
{
for(i=d ;i<len;i++)
{
temp=str[i];
for(j=i-d;j>=0&&temp<str[j];j-=d)
str[j+d]=str[j];
str[j+d]=temp;
}
}
}
vector<int> beauty(vector<string> name)
{
int len = name.size();
int i,j,d,k;
char temp;
int elem;
vector<int> res(len);
for(i=0;i<len;i++)
{
int count[26]={0,0,0,0,0};
res[i]=0;
sort(name[i].begin(),name[i].end());
transform(name[i].begin(), name[i].end(), name[i].begin(), toupper);
for(j=0;j<name[i].size();j++)
{
count[name[i][j]-65]++;
}
shellsort(count,26);
for(k=25;count[k]>0&&k>=0;k--)
{
res[i]+=count[k]*(k+1);
}
}
return res;
}
vector<int> beautyname(vector<string> name)
{
int len = name.size();
int i,j,d,k;
vector<int> res(len);
map<char,int> int_char;
vector<int> temp;
for(i=0;i<len;i++)
{
int_char.clear();
temp.clear();
for(j=0;j<name[i].size();j++)
{
if(int_char.count(name[i][j])==0) int_char[name[i][j]]=1;
else int_char[name[i][j]]++;
}
for(map<char,int>::iterator iter=int_char.begin();iter!=int_char.end();iter++)
temp.push_back((*iter).second);
sort(tempres.begin(),tempres.end());
res[i]=0;
for(j=0;j<tempres.size();j++)
res[i]+=tempres[tempres.size()-1-j]*(26-j);
}
return res;
}
int main()
{
int N;
int i;
cin>>N;
vector<string> name(N);
vector<int> bea(N);
vector<int> bea2(N);
for(i=0;i<N;i++)
cin>>name[i];
bea=beauty(name);
bea2=beautyname(name);
for(i=0;i<N;i++)
cout<<bea[i]<<' '<<bea2[i]<<endl;
}