最近在 51Nod 学习贪心算法入门,就把做题目的思路一些记录下来,欢迎指正。
题目详情我们要给每个字母配一个1-26之间的整数,具体怎么分配由你决定,但不同字母的完美度不同,而一个字符串的完美度等于它里面所有字母的完美度之和,且不在乎字母大小写,也就是说字母F和f的完美度是一样的。
现在给定一个字符串,输出它的最大可能的完美度。例如:dad,你可以将26分配给d,25分配给a,这样整个字符串最大可能的完美度为 77。
输入:dad
输出:77
解题思路:先把输入的字符串全部转成小写,然后找出出现次数最多的字母,然后次数最多的给26,其次为25,后面就以此类推,最后求和就行了。
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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| static void Main(string[] args) { //将输入的字符串转成小写 string str = Console.ReadLine().ToLower(); //将输入的字符串转成char类型的数组 char[] charArr = str.ToCharArray(); //定义一个长度为26的int类型数组 int[] count = new int[26]; foreach (char c in charArr) { // 字母减去a的结果作为字母的索引,然后对应的值+1 // 不理解的话取消下面的注释运行 //Console.WriteLine(c - 'a'); count[c - 'a']++; } //使用冒泡排序将出现次数按照递减排列 BubbleSort(count); //字符串完美度初始值 int pretect = 0; for (int i = 0; i < 26; i++) { if (count[i] != 0) { //count[i] 取出对应字母的出现次数 pretect += count[i] * (26 - i); } else { //如果等于0则说明后面的字母都没有出现过 break; } //Console.WriteLine("{0}:{1}", (char)(i + 'a'), count[i]); } Console.WriteLine(pretect); Console.ReadLine(); }
/// <summary> /// 冒泡排序 /// </summary> /// <param name="count"></param> public static void BubbleSort(int[] count) { for (int i = 0; i < count.Length; i++) { for (int j = i; j < count.Length; j++) { if (count[i] < count[j]) { int temp = count[j]; count[j] = count[i]; count[i] = temp; } } } }
|
这是一篇过去很久的文章,其中的信息可能已经有所发展或是发生改变。