当前位置: 首页 > article >正文

小红的字母游戏(A组)

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

题目描述

小红有一个长度为 nnn 的字符串 sss,仅包含小写字母,小红可以选出 kkk 个字符,组成一个新的字符串 ttt,对于 ttt 的每一个字符 tit_iti​,如果 tit_iti​ 在 ttt 中出现的次数为 yyy,则小红会获得 yyy 的分数,现在小红想知道,她最多能获得多少分。

输入描述:

第一行两个整数 n,kn,kn,k,表示字符串 sss 的长度和小红选出的字符个数。
第二行一个字符串 sss,表示小红的字符串。
1≤k≤n≤1051 \leq k \leq n \leq 10^51≤k≤n≤105

输出描述:

 

输出一个整数,表示小红最多能获得的分数。

示例1

输入

复制5 3 aabcc

5 3
aabcc

输出

复制5

5

说明

 

小红选出 "acc",第一个字符获得 1 分,第二个字符获得 2 分,第三个字符获得 2 分,一共获得 5 分。

import java.util.*;

public class Main {

    public static void main(String args[]) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int k = in.nextInt();
        in.nextLine();
        String s = in.next();

        // 统计每个字符的频率
        int[] freq = new int[26];
        for (int i = 0; i < n; i++) {
            freq[s.charAt(i) - 'a']++;
        }

        // 对频率数组进行降序排序
        Integer[] freqWrapper = new Integer[26];
        for (int i = 0; i < 26; i++) {
            freqWrapper[i] = freq[i];
        }
        Arrays.sort(freqWrapper, Collections.reverseOrder());

        long score = 0;
        // 从最高频率开始贪心的选择字符
        for (int i = 0; i < 26 && k > 0; i++) {
            if (freqWrapper[i] < k) {
                score += (long) freqWrapper[i] * freqWrapper[i];
                k -= freqWrapper[i];
            } else {
                score += (long) k * k;
                k = 0;
            }
        }

        System.out.println(score);
    }
}
import java.util.*;
import java.io.*;
public class Main{
    static int n;
    public static void main(String[] args) throws IOException{
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        PrintWriter pw=new PrintWriter(System.out);
        String[] st=  br.readLine().split(" ");
        int n=Integer.parseInt(st[0]);
        int k=Integer.parseInt(st[1]);
        char[] arr= br.readLine().toCharArray();
        int[] cnt=new int[26];
        for(int i=0;i<n;i++){
            cnt[arr[i]-'a']++;
        }
        long ans=0;
        Arrays.sort(cnt);
        for(int i=25;i>=0;i--){
            if(k>=cnt[i]){
                ans +=(long)cnt[i]*cnt[i];
            }else {
                ans +=(long)k*k;
                break;
            }
            k-=cnt[i];
        }
        pw.println(ans);
        pw.close();
    }
}


http://www.kler.cn/a/568948.html

相关文章:

  • Rust~Pin的new
  • 【git】【rebase】git修改提交信息的几种方法
  • 【AI Coding】Windsurf:【Prompt】全局规则与项目规则「可直接使用」
  • 如何在 ArcGIS Pro 中将SHP转为KML:详细步骤与操作指南
  • 基于互联网协议的诊断通信(DoIP)
  • 《HarmonyOS Next × ArkTS框架:从AI模型压缩到智能家居控制的端侧开发指南》
  • 对rust中的from和into的理解
  • Android 应用开发中,证书、签名和加固简述
  • 加入二极管的NE555 PWM 电路
  • Go在1.22版本修复for循环陷阱
  • RJ45网口 与 M12连接器对比(D-code,X-code)
  • 面试常见问题
  • UDP接收方法使用Task替代Thread(解决关闭程序未响应的问题)
  • Flink事件时间和处理时间咋区分
  • yolov8_pose模型,使用rknn在安卓RK3568上使用
  • 深入解析 MySQL 中的时间函数:NOW() 与 SYSDATE() 的奥秘
  • TCP的四次挥⼿为什么是四次?为什么不能是三 次
  • 【计算机网络——概述】
  • 深搜专题7:最大质数
  • 【基于Raft的KV共识算法】-序:Raft概述