小红拿到了一排格子,每个格子的背景是红色或者蓝色。
小红希望你将每个格子上填写一个小写字母,需要满足相同的字母的背景颜色是相同的。
小红希望最终出现次数最多的字母的出现次数尽可能小。你能帮帮她吗?
一个仅由字符'0'和'1'组成的字符串,长度不超过200000。字符串用于表示小红拿到的格子的颜色。第个字符为'0'代表第第
个格子为蓝色背景,字符'1'代表红色背景。
一个仅由小写字母构成的字符串,第个字符为第
个格子上填写的字母,请务必保证字符串是合法的。如果有多解,输出任意即可。
010
abc
'a'为蓝色,'b'为红色,'c'为蓝色。三种字母均只出现了一次
000000000000000000000000001
bbcdefghijklmnopqrstuvwxyza
我们这个填空方案中,两个'b'都是蓝色,符合题目要求。除了'b'出现2次以外,其余的字母均只出现了1次。
import sys from math import ceil def minTime(s: str): x = "abcdefghijklmnopqrstuvwxyz" n = len(s) if n <= 26: return x[:n] num0 = s.count("0") num1 = s.count("1") if num0 == 0 or num1 == 0: num = max(num0, num1) a, b = divmod(num, 26) return x * a + x[:b] t = 0 if num0 < num1: t = ceil(num0 / (num0 + num1) * 26) else: t = 26 - ceil(num1 / (num0 + num1) * 26) alpha_for0 = x[:t] alpha_for1 = x[t:] i, j = 0, 0 ans = "" for c in s: if c == "0": ans += alpha_for0[i] i = (i + 1) % len(alpha_for0) else: # c=='1' ans += alpha_for1[j] j = (j + 1) % len(alpha_for1) return ans s = input() print(minTime(s))
import java.util.Scanner; import java.lang.Math.*; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); // 注意 hasNext 和 hasNextLine 的区别 // while (in.hasNextInt()) { // 注意 while 处理多个 case // int a = in.nextInt(); // int b = in.nextInt(); // System.out.println(a + b); // } String s = in.nextLine(); char[] ch = s.toCharArray(); StringBuilder sb = new StringBuilder(); if (s.length() <= 26) { for (int i = 0; i < s.length(); i++) { sb.append((char)('a' + i)); } System.out.println(sb); } else { int t1 = 0, t0 = 0; for (char c : ch) { if (c == '0') t0++; else t1++; } if (t0 == 0 || t1 == 0) { for(int i=0;i<s.length();i++){ sb.append((char)('a'+(i%26))); } } else { // 试了一下 Math.round 会卡在19/20;Math.floor 会卡在10/20 // 可是为什么呢,t0是少的那个,不应该分配相对少一点的字母吗,为什么是ceil啊 if(t0<t1) t0 = (int)(Math.ceil((t0 * 1.0 / (t0 + t1)) * 26)); else{ t0=26-(int)(Math.ceil((t1 * 1.0 / (t0 + t1)) * 26)); } //t1 = 26-t0; for (int i = 0, tt0 = 0, tt1 = t0; i < s.length(); i++) { if (tt0 == t0) tt0 = 0; if (tt1 == 26) tt1 = t0; if (ch[i] == '0') { sb.append((char)('a' + tt0)); tt0++; } else { sb.append((char)('a' + tt1)); tt1++; } } } System.out.println(sb); //System.out.println(t0+" "+t1+" "+t0*1.0/(t0+t1)+" "+t0*1.0/(t0+t1)*26+" "+(int)(t0*1.0/(t0+t1)*26)); } } }