您的位置:首页 > 其它

51NOD OJ 完美字符串

2016-03-09 23:32 357 查看
输入

输入一个字符串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;
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  OJ