背景
着色书
我拿出我最喜欢的涂色书,翻到一张我还没有涂色的随机页面,然后把它放在我的桌子上。然后我拿出我所有的蜡笔并将它们排列在桌子上(这是一张很长的桌子)。第 i 个蜡笔的颜色是字符串 c[i](例如“blue”)。许多蜡笔具有相同的颜色。事实上,无论我有多少蜡笔,其中最多有30种不同的颜色。
要开始上色,我总是会拿出一张放在桌子上的蜡笔的子列表(sublists)(参见 Q1 的定义),然后把其余的收起来。
子列表(sublists)定义:列表a的子列表是您可以通过从 a 的开头删除一些(可能为 0)元素,然后从其末尾删除一些(可能为 0)元素来获得的任何列表。
我看看我面前的线条艺术,想知道,“我需要多少种不同的颜色才能让它看起来很棒?一?二?也许三个?”。
现在你明白了我的困境,决定帮助我,告诉我每个数字 k,如果我要使用 k 种不同的颜色,我需要带的最少蜡笔数量是多少?
Input
输入由一行组成,其中包含 n 个以空格分隔的颜色名称,指定列表 c。
Output
设 m 为 c 中不同颜色的数量。然后,输出 m 个空格分隔的整数。它们中的第 k 个(基于 1)应该是我需要使用的最少数量的蜡笔,以便它们之间至少有 k 个不同的颜色。
限制
1 ≤ n ≤ 5 × 104
1 ≤ len(c[i]) ≤ 5
c中最多有30种不同的颜色。
时限
您的程序必须在任何有效输入的 4 秒内完成运行。
Sample Input 1
green red red blue red red green
Sample Output 1
1 2 4
Sample 1 Explanation
如果我只想使用一种颜色,我可以拿任何一支蜡笔。
如果我想使用 2 种不同的颜色,我可以采用长度为 2 的子列表,例如子列表 red blue。
如果我想使用所有三种颜色,最小可能的子列表长度为 4。例如,我可以采用蓝色红色红色绿色。
Sample Input 2
r g z g b b r r g y g g y b
Sample Output 2
1 2 3 5 8
提示
有几种方法可以解决这个问题,但并不是所有的方法都足够快以在时间限制内通过最大的测试用例。
对于 100% 解决方案,这是一个起点(70% 解决方案不需要):当您处理颜色时,如果您知道每种颜色最近出现的索引怎么办?
我的代码(没什么思路 随便打打
def f():
while(start<=end):
mid = (start + end)//2
if(is_possible_to_visit_all_planets(d,k,mid)):
minimum_capacity_required = min(minimum_capacity_required,mid)