蓝桥杯:1.分糖果(Java)

目录

  • 问题描述
  • 输入描述
  • 输出描述
  • 样例输入
  • 样例输出
  • 代码演示:

问题描述

最近暑期特训算法班的同学们表现出色,他们的老师肖恩决定给他们分发糖果。肖恩购买了n个不同种类的糖果,用小写的阿拉伯字母表示。
每个糖果必须分发给一个同学,并且每个同学至少要分到一个糖果。同学们的开心程度定义为他们所分到的糖果组成的字符串s[团的字典序。
肖恩希望同学们的开心程度相差尽量小,因此他要找到一种方案,使得所有糖果组成的字符串中字典序最大的字符串尽可能小。请输出能够实现字典序最小可能的max(s[1],s[2], s[3],…, s[a])。

输入描述

第—行输入两个整数n和x,分别表示有n个糖果x个同学。
第二行输入一个长度为n的字符串S , S[i]表示第i个糖果的种类。
数据保证 1 < n < 1 0 6 11<n<106, 1 < x < n , S [ i ] ∈ [ ′ a ′ , ′ z ′ ] 1 1<x<n,S[i][a,z]

输出描述

输出一个字符串,为所有糖果组成的字符串中字典序最大的字符串最小的可能值。

样例输入

6 2
caabdc

样例输出

abccd
说明
—个最优分配方案是一个同学拿到abccd , 一个同学拿到a。

代码演示:

import java.util.Arrays;
import java.util.Scanner;
public class Main{
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		// 在此输入您的代码...
		int n = scan.nextInt();// 糖果数
		int x = scan.nextInt();// 人数
		String string = scan.next();// 读入字符串
		char[] chars = string.toCharArray();// 转成字符数组 方便排序

		Arrays.sort(chars);// 按照字典序排序 sort默认
		// 分为三种情况进行讨论
		if (chars[0] == chars[n - 1]) {
			// 数组种全部字符相同
			// 尽可能均分
			for (int i = 0; i < n / x + (n % x == 0 ? 0 : 1); i++) {// 直接糖果数除以人数 如果有余数,循环次数加一
				// 循环判断条件为:最大字典序的字符串的输出
				System.out.print(chars[i]);
			}

		} else if (chars[0] == chars[x - 1]) {
			// 除最后一个人有多个糖果,其他人都是一个糖果
			for (int i = x - 1; i < n; i++) {
				// 直接把除开前面人数的糖果之后的糖果分给最后一人
				System.out.print(chars[i]);
			}
		} else {
			// 最后一人之前的糖果字符都不相同,其后面的字典序也比他更小,
			// 则为了是字典序差距变小,最后一人只获得该一个糖果,其他人瓜分其后面的糖果
			System.out.print(chars[x - 1]);
		}

		scan.close();
	}
}

你可能感兴趣的:(蓝桥杯刷题,蓝桥杯,java,算法)