有两个线程描述了这个问题:
我重申Hacker Rank上的问题,为方便起见,再次在这里:
ADZEN是您所在城市非常受欢迎的广告公司。在每条路上你都可以看到他们的广告牌。最近他们面临着严峻的挑战,MG Road是您所在城市中最常用,最美丽的道路,几乎被广告牌所填满,这对自然景观产生负面影响。
根据人们的要求,ADZEN已经决定拆除一些广告牌,以便在道路的任何一个区域内不超过K个广告牌。
你可以假设MG Road是一条带有N个广告牌的直线。最初两个adjecent广告牌之间没有差距。
ADZEN的主要收入来自这些广告牌,因此广告牌移除过程必须以这样的方式完成:剩余的广告牌应该在所有可能的最终配置中提供最大可能的利润。配置的总利润是总和该配置中存在的所有广告牌的利润值。
给定N,K和N个广告牌中每个广告牌的利润值,输出在给定条件下可从剩余广告牌获得的最大利润。
我对此问题的解决方案基于以下观察结果:给定K时,您可以使用K + 1种不同的方法在K<N
时移除广告牌,如果K == N则只有1.因此,在这种情况下, K<N
我创建了K + 1个桶,其中每个桶对应一个解决方案。每个存储桶将保留广告牌收入,这些收入不会包含在相应的解决方案中。因此,最佳解决方案是具有最小收入总和的解决方案。我的代码如下:
public class Billboards {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String[] nums = in.readLine().split("\\s+");
int n = Integer.parseInt(nums[0]);
int k = Integer.parseInt(nums[1]);
HashMap<Integer,Long> map = new HashMap<Integer, Long>();
long number;
int index;
int bucketsNumber = k+1;
long sum = 0;
for(int i=0; i<n; i++){
number = Long.parseLong(in.readLine());
sum+=number;
index = i%bucketsNumber;
if (map.containsKey(index)){
map.put(index, map.get(index) + number);
} else {
map.put(index, number);
}
}
long min = Long.MAX_VALUE;
for (int key : map.keySet()){
if (map.get(key)<min){
min = map.get(key);
}
}
if(k==n)
System.out.println(sum);
else
System.out.println(sum-min);
}
}
然而,这段代码并没有解决所有情况,但我似乎无法找出原因。我的解决方案的逻辑是否存在问题?