输入
输入一个字符串S(S的长度 <= 10000),S中没有除字母外的其他字符。
输出
由你将1-26分配给不同的字母,使得字符串S的完美度最大,输出这个完美度。
输入示例
dad
输出示例
77
分析: 由排序不等式,出现次数最多的字母显然应该给26。所以这个题目变成了统计每种字母出现的次数了,然后按照出现次数从大到小,依次分配从高到低的权值。这就是最朴素的贪心思想。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define MAX_STRING_LEN 10000
#define MAX_NUM 26
int g_num[MAX_NUM] = {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};
int comp(const void*a,const void*b)
{
return *(int*)a-*(int*)b;
}
int not_a_char(char c)
{
if ((c >='a' && c <='z') || (c >= 'A' && c <= 'Z'))
{
return FALSE;
}
else
{
return TRUE;
}
}
/*是否是大写字母*/
int is_a_uppercase(char c)
{
if (c >= 'A' && c <= 'Z')
{
return TRUE;
}
else
{
return FALSE;
}
}
/*是否是小写字母*/
int is_a_lowercase(char c)
{
if (c >= 'a' && c <= 'z')
{
return TRUE;
}
else
{
return FALSE;
}
}
int char_to_num (char c)
{
if (not_a_char(c))
{
printf("ERROR,NOT A CHAR!\n");
return -1;
}
if (is_a_uppercase(c))
{
return c - 'A';
}
if (is_a_lowercase(c))
{
return c - 'a';
}
}
int main(void)
{
char *s1 = (char *)malloc(MAX_STRING_LEN * sizeof(char));
if (NULL == s1)
{
printf("alloc memory for s1 failed\n");
return -1;
}
if(NULL == gets(s1))
{
printf("get s1 failed.\n");
return -1;
}
int len = strlen(s1);
int i=0;
int count[MAX_NUM]={0};
int result = 0;
for (; i<len; i++)
{
count[char_to_num(s1[i])]++;
}
qsort(count, MAX_NUM, sizeof(int), comp);
for (i=0; i<MAX_NUM; i++)
{
result += (count[i] * g_num[i]);
}
printf("%d\n", result);
free(s1);
return 0;
}