QY8. 字符串价值
描述
有一种有趣的字符串价值计算方式:统计字符串中每种字符出现的次数,然后求所有字符次数的平方和作为字符串的价值输入描述
输入包括两行,第一行一个字符串s,字符串s的长度length(1 ≤ length ≤ 50),其中只包含小写字母('a'-'z')。 第二行包含一个整数k(0 ≤ k ≤ length),即允许移除的字符个数。输出描述
输出一个整数,表示得到的最小价值示例1
输入:
aba 1
输出:
2
C 解法, 执行用时: 2ms, 内存消耗: 236KB, 提交时间: 2019-06-17
#include<stdio.h> #include<string.h> int main() { char arr[50]; int k; scanf("%s%d", arr, &k); int* dp = malloc(sizeof(int) * 26); memset(dp, 0, sizeof(int) * 26); int n = strlen(arr); for(int i = 0; i < n; i++) { dp[arr[i] - 'a']++; } int s; while(k--) { s = 0; for(int i = 1; i < 26; i++) if(dp[s] < dp[i]) s = i; dp[s]--; } s = 0; for(int i = 0; i < 26; i++) if(dp[i] > 0) s += dp[i] * dp[i]; free(dp); printf("%d\n", s); return 0; }
C 解法, 执行用时: 2ms, 内存消耗: 332KB, 提交时间: 2019-07-25
#include<stdio.h> #include<string.h> int main() { char arr[50]; int k; scanf("%s%d", arr, &k); int* dp = malloc(sizeof(int) * 26); memset(dp, 0, sizeof(int) * 26); int n = strlen(arr); for(int i = 0; i < n; i++) { dp[arr[i] - 'a']++; } int s; while(k--) { s = 0; for(int i = 1; i < 26; i++) if(dp[s] < dp[i]) s = i; dp[s]--; } s = 0; for(int i = 0; i < 26; i++) if(dp[i] > 0) s += dp[i] * dp[i]; free(dp); printf("%d\n", s); return 0; }
C 解法, 执行用时: 2ms, 内存消耗: 364KB, 提交时间: 2019-03-24
#include<stdio.h> #include<string.h> int main() { char arr[50]; int k; scanf("%s%d", arr, &k); int* dp = malloc(sizeof(int) * 26); memset(dp, 0, sizeof(int) * 26); int n = strlen(arr); for(int i = 0; i < n; i++) { dp[arr[i] - 'a']++; } int s; while(k--) { s = 0; for(int i = 1; i < 26; i++) if(dp[s] < dp[i]) s = i; dp[s]--; } s = 0; for(int i = 0; i < 26; i++) if(dp[i] > 0) s += dp[i] * dp[i]; free(dp); printf("%d\n", s); return 0; }
C 解法, 执行用时: 2ms, 内存消耗: 364KB, 提交时间: 2019-01-30
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #define LENTH 101 #define NUM 27 void Show(int *pa); void Find_Max(int *pa); void Count(int *pa,char *ps); int Value(int *pa); int main(void) { int k = 0; char words[LENTH]; int num[NUM] = {0}; scanf("%s", words); scanf(" %d", &k); //printf("k=%d\n", k); Count(num,words); // puts("Count:"); // Show(num); // puts("After:"); while(k--) Find_Max(num); // Show(num); printf("%d\n", Value(num)); return 0; } void Count(int *pa,char *ps) { int i; char j; for(i=0;i<strlen(ps);i++) { for(j='a';j<='z';j++) { if(ps[i] == j) pa[j-'a']++; } } } void Find_Max(int *pa) { int k = 0, i; for(i=1;i<NUM;i++) if(pa[k]< pa[i]) k = i; // printf("pa[%d]=%d\n", k ,pa[k]); pa[k]--; } int Value(int *pa) { int ret = 0; int i; for(i=0;i<NUM;i++) ret += pa[i]*pa[i]; return ret; } void Show(int *pa) { int i; for(i=0;i<NUM;i++) printf("%d\n", pa[i]); }
C 解法, 执行用时: 2ms, 内存消耗: 368KB, 提交时间: 2019-05-06
#include<stdio.h> #include<string.h> int main() { char arr[50]; int k; scanf("%s%d", arr, &k); int* dp = malloc(sizeof(int) * 26); memset(dp, 0, sizeof(int) * 26); int n = strlen(arr); for(int i = 0; i < n; i++) { dp[arr[i] - 'a']++; } int s; while(k--) { s = 0; for(int i = 1; i < 26; i++) if(dp[s] < dp[i]) s = i; dp[s]--; } s = 0; for(int i = 0; i < 26; i++) if(dp[i] > 0) s += dp[i] * dp[i]; free(dp); printf("%d\n", s); return 0; }