CF-335A-Banana

题目链接

题意:给定一个字符串str,和数字n ,你可以获取n个字母组成字符串s,求获得str需要的多少个s才能组成str(求s得最小值)

思路:先将字符串放进一个长度为26的数组中,得到每种字母的数量,用set记录字母的种类,然后判断n小于set直接输出-1,反之则新建一个二维数组a[set.size()][3]第一个数代表字母的数量,第二个数代表字母的种类,第三个数代表在s中该字母的数量,每次都以第一个数为标准排序,可得到最大的数,对最大数所对应的字母在s中再添加一个,并处理最大的数( a[set.size()-1][0]=a[set.size()-1][0]*(a[set.size()-1][2]-1)/a[set.size()-1][2])

AC代码:

import java.io.*;
import java.math.*;
import java.math.BigInteger;
import java.util.*;
public class Main{
 public static void main(String[] args) {
  Scanner sc=new Scanner (System.in);
  String str=sc.next();
  int n=sc.nextInt();
  int arr[]=new int [26];
  Set<Integer>set =new HashSet<>();
  for(int i=0;i<str.length();i++) {
   arr[(int)(str.charAt(i)-'a')]++;
   set.add((int)(str.charAt(i)-'a'));
  }
  System.out.println(Arrays.toString(arr));
  if(set.size()>n) {
   System.out.println(-1);
   return;
  }
  double a[][]=new double [set.size()][3];
  int ii=0;
  for(int i=0;i<26;i++) {
   if(arr[i]!=0) {
    a[ii][1]=i;
    a[ii][0]=arr[i];
    a[ii][2]=2;
    ii++;
   }
  }
  StringBuilder s=new StringBuilder("");
  for(int i=0;i<set.size();i++) {
   s.append((char)(a[i][1]+'a'));
  }
  n=n-set.size();
  show(a);
  while(n>0) {
   a[set.size()-1][0]=a[set.size()-1][0]*(a[set.size()-1][2]-1)/a[set.size()-1][2];
   s.append((char)(a[set.size()-1][1]+'a'));
   a[set.size()-1][2]++;
   show(a);
   n--;
  }
  if(a[set.size()-1][0]%1==0)System.out.println((int)(a[set.size()-1][0]));
  else System.out.println((int)(a[set.size()-1][0])+1);
  System.out.println(s);
 }
 public static void show(double arr[][]) {
   Arrays.sort(arr,new Comparator<double[]>(){
          @Override
          public int compare(double[] a1,double a2[]) {
           if(a1[0]>a2[0]) {
            return 1;
           }else
            return -1;          
          }
       });
 }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值