列表

详情


QY8. 字符串价值

描述

有一种有趣的字符串价值计算方式:统计字符串中每种字符出现的次数,然后求所有字符次数的平方和作为字符串的价值
例如: 字符串"abacaba",里面包括4个'a',2个'b',1个'c',于是这个字符串的价值为4 * 4 + 2 * 2 + 1 * 1 = 21
牛牛有一个字符串s,并且允许你从s中移除最多k个字符,你的目标是让得到的字符串的价值最小。

输入描述

输入包括两行,第一行一个字符串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;
}

上一题