51NOD OJ 完美字符串

来源:互联网 发布:淘宝 进口啤酒真相 编辑:程序博客网 时间:2024/06/05 19:25
输入

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





0 0
原创粉丝点击