http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1182
题意:给定一个字符串,然后可以随意分配每个字符1-26的完美度,问最大完美度是多少。
思路:贪心,开始太疏忽,没有想到贪心,因为26肯定是分配给出现次数最多的那个,其他依次递减。我用一个数组保存每个字符出现的次数,然后在从大到小排序就行。
#include<cstdio>
#include<cstring>
#include<ctype.h>
#include<algorithm>
using namespace std;
char s[10001];
int b[10001];
int cmp(int x,int y)
{
return x>y;
}
int main()
{
int sum,n,m,k;
while(scanf("%s",s)!=EOF)
{
int i,l=strlen(s);
n=26;
sum=0;
k=l;
memset(b,0,sizeof(b));
//printf("%d\n",'0');
for(i=0;i<l;i++)
{
if(isalpha(s[i])) s[i]=toupper(s[i]);
m=s[i]-'A';
b[m]++;
//printf("%d\n",b[m]);
}
sort(b,b+26,cmp);
/*for(i=0;i<26;i++)
{
printf("%d\n",b[i]);
}*/
for(i=0;i<26;i++)
{
if(b[i]!=0) {sum+=b[i]*n--;}
}
printf("%d\n",sum);
}
return 0;
}