为什么我的代码无法通过隐藏的输入测试用例?

时间:2018-08-23 17:12:15

标签: java algorithm user-input

这是要解决的问题:

约翰今天被分配了一项新任务。给他一个包含N个整数的数组A。他的任务是将数组的所有元素更新为某个最小值x,即A[i] = x; 1 <= i <= N;,以使此新数组的总和严格大于初始数组的总和。 请注意,x应该尽可能小,以使新数组的总和大于初始数组的总和。

输入格式: 输入的第一行包含一个整数N,该整数N表示数组A中的元素数。

第二行由N个以空格分隔的整数组成,表示数组元素。

输出格式: 输出的唯一行由x的值组成。

示例输入

5

12345

示例输出: 4 说明:

数组的初始总和= 1 + 2 + 3 + 4 + 5 = 15

将所有元素更新为4时,数组的总和= 4 + 4 + 4 + 4 + 4 + 4 = 20,大于15。

请注意,如果我们已将数组元素更新为3,则sum = 15,该值不大于15。因此,4是需要更新数组元素的最小值。

** ==>这是我的代码。我该如何改善?或这段代码有什么问题? **

    import java.util.Scanner;

public class Test2 {
    public static void main(String []args){
        Scanner s=new Scanner(System.in);
        int check=0, sum=0, biggest=0;
        int size=s.nextInt();

        if(size>=1 && size<=100000) {
            int[] arr=new int[size];
            for(int i=0; i<size; i++){
                int temp=s.nextInt();
                if(temp>=1 && temp<=1000) {
                    arr[i] = temp;
                    biggest=biggest > temp ? biggest:temp;
                    sum=sum+temp;
                }
                else break;
            }
            for(int i=1; i<biggest; i++){
                check=(size*i)>sum ? i:0;

            }
            System.out.print(check);

        }
        else System.err.print("Invalid input size");


    }
}

3 个答案:

答案 0 :(得分:1)

不确定我是否完全遵循您的尝试,但是应该有一个非常简单的解决方案。您知道数组的大小,可以轻松地遍历数组以获取存储在其中的元素的值。找到最小值x所需要做的就是取sumOfArray / array的大小,然后在结果中加1以使结果更高。

在您的示例中15/5 = 3。 3 + 1 = 4,这就是您的答案。如果数字总和为43、43 / 5 = 8 r 3,那么您的答案是9(9 * 5 = 45)。等等

答案 1 :(得分:1)

问题:

for(int i=1; i<biggest; i++){
     check=(size*i)>sum ? i:0;
}

2个问题,因此不起作用。它们如下-

  • (size*i)>sum ? i-问题声明指出,它需要的最小可能总和大于元素数组的总和。您的代码盲目地将i分配给check,而无需检查最小值

  • check=(size*i)>sum ? i :0 -因此,即使遇到整数previously,也会丢失它,因为您已将其分配给 0 < / strong>,如果不满足条件。

我将分享我的想法。

  

方法1

  • 像您一样对所有元素进行求和。
  • 现在,取元素的平均值-数组的总和。假设我们将其存储在变量average中。
  • 打印平均值+ 1 作为答案,因为该值可以为您提供最小可能的总和>数组本身的总和。

时间复杂度: O(n),其中n是数组的大小。

空间复杂度: O(1)

  

方法2

  • 像您一样对所有元素进行求和。
  • 计算数组的最小值和最大值,并将其存储在变量中,例如minimaxi
  • 现在,在minimaxi之间进行二进制搜索,并继续检查minimum sum > sum条件。
  • 在此过程中,您将拥有lowmidhigh之类的变量。

    low = mini,high = maxi
    while low <= high:
      mid = low + (high - low) / 2
      If mid * size <= sum, 
         low  = mid + 1
      else 
         high = mid - 1
    
  • 现在,打印low作为答案。

range = maxi-mini

时间复杂度:渐近地,O(n)+ O(log(range))= O(n),其中n是数组的大小。

空间复杂度: O(1)

答案 2 :(得分:0)

尝试其他测试用例时,结果是错误的。试试:

输入:

5
1 1 1 1 5

预期输出: 2 实际输出: 4

输入:

5
5 5 5 5 5

预期输出: 6 实际输出: 0