我試圖解決平等問題https://www.hackerrank.com/challenges/equal/problem平等任務 - 算法設計
這裏是我的代碼
import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;
public class Solution {
static List<Integer> memo = new ArrayList<Integer>();
public static void main(String args[]) throws Exception {
Scanner in = new Scanner(System.in);
int test = in.nextInt();
int n = in.nextInt();
//we initialize a list of memoized values for ho many 1,2,5 choccolates we need to get 1 ... 100
/*
we have 1, 2 and 5 to add
if k<=2 then k=1
if k>2 and k<5 then n[k] = n[k-2]+1
if k==5 then k=1
if k > 5 then n[k] = n[k-5]+1
*/
memo.add(1);
memo.add(1);
for (int i=0;i<100;i++){
if(i==4){
memo.add(1);
}
if(i>1 && i<4){
memo.add(memo.get(i-2)+1);
}
if(i>4){
memo.add(memo.get(i-5)+1);
}
}
//System.out.println(memo.toString());
for (int i=0;i<test;i++){
int val[] = new int[n];
for (int j=0;j<n;j++){
val[j]=in.nextInt();
}
//we sort the values in order to start from the minimum
Arrays.sort(val);
//System.out.println(Arrays.toString(val));
calculateOperations(val);
}
}
//we extend at runtime the memoized values if they are not enough
public static int computeCount(int val){
if(val==0){
return 0;
}
int ml = memo.size();
if(val<=ml){
return memo.get(val-1);
}else{
for (int i=ml-1;i<val;i++){
if(i==4){
memo.add(1);
}
if(i>1 && i<4){
memo.add(memo.get(i-2)+1);
}
if(i>4){
memo.add(memo.get(i-5)+1);
}
}
return memo.get(val-1);
}
}
// 1 1 3 5 9
// 2 2 4 6 9
public static int [] addChoccolate(int [] values,int val,int no){
for (int k=0;k<values.length;k++){
if(k!=no){
values[k] = values[k]+val;
}
}
return values;
}
public static int findDelta(int [] values){
int s1 = values[0];
for (int k=1;k<values.length;k++){
if(values[k]!=s1){
return k;
}
}
return 0;
}
public static void calculateOperations(int val[]){
int count =0;
int delta = findDelta(val);
while(delta>0){
count += computeCount(val[delta]-val[0]);
val = addChoccolate(val,val[delta]-val[0],delta);
//System.out.println(Arrays.toString(val));
Arrays.sort(val);
delta = findDelta(val);
}
System.out.println(count);
}
}
它適用於輸入
1
5
1 3 5 5 9
實際上它打印出來8
這是正確的,因爲它可以表明,從起始狀態
[1,3,5,5,9]我們可以加2除了第二,然後得到[3,3,7,7,11]
然後我們可以添加兩次2(4)給所有但是第3個並得到[7,7,11,15]
然後我們可以添加兩次2(4)除了第4次,所有[11,11,11,11,19]
最後加1次5,一次2和一個時間1(8)所有,但最後一個[19,19,19,19,19]
總結應用這些操作我們得到:
1 +2 +2 + 3 = 8
然而:我不明白爲什麼它不會爲HackerRank工作測試
但也許它可以在少於8個步驟完成? – JohnnyAW
對於哪些輸入數據不起作用?預期的結果是什麼?什麼是實際結果? – Egl
給出8的例子[1,3,5,5,9]是正確的。我想到的算法將大約20行代碼,並運行在O(N)中。 –