以下解决方案更改数组以使其不减少有什么问题?

时间:2016-04-23 14:03:01

标签: java arrays algorithm

我期待的不是确切的答案,而是我可以改进解决方案的方式。 目前它的错误,它甚至没有通过一个测试用例。 在一种情况下,它给出了错误的答案,而其他情况则表示超时。

问题

给定大小为N的数组A.将其转换为数组,使得A [i-1]&lt; A [i]我属于[2,N]。我们可以多次将X添加到此数组的任何元素中。我们的任务是告诉为了获得A [i-1] <1,需要这种X的最小添加次数。满足[i]条件。

输入

输入的第一行将包含T(测试用例编号)。     对于每个测试用例,第一行将包含两个空格分隔的整数,表示N和X.下一行将包含N个空格分隔的整数,表示A [i]。

输出

对于每个测试用例,请在新行中打印所需答案。

示例输入

2    // Total Number of Test Cases
2 1    // First value is N and second is X
1 1    // Elements of the first Array
3 1    // First value is N and second is X for the second array
1 1 2  // Elements of the second array

示例输出

1
2

我的解决方案: -

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;


class TestClass {
    public static void main(String args[] ) throws Exception {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line = br.readLine();
        int T = Integer.parseInt(line);// Total number of Test Cases
        int N = 0;// Number of elements in the Array
        int X = 0;// The number which can be added to the elements of the array
        int[] arr;
        int count;// Final count value which needs to be shown
        while(T-->0) {
            String[] str = br.readLine().trim().split("\\s+");
            N= Integer.parseInt(str[0]);
            X = Integer.parseInt(str[1]);
            arr = new int[N];
            str = br.readLine().trim().split("\\s+");
            count = 0;
            for(int i = 0; i < N; i++){
                arr[i] = Integer.parseInt(str[i]);
            }

            for(int i = 1; i < N ; i++){
                while(arr[i - 1] >= arr[i]){
                    arr[i] += X;
                    count++;
                }
            }
            System.out.println(count);
        }


    }
}

对于上面的示例输入,上面代码生成的答案是正确的,但在其他情况下,它会被在线裁判隐藏,并且它会给出超时。 如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

两个潜在问题:

首先,你的for循环中有一个while循环。您应该能够使用divison而不是循环直接计算迭代次数。这应该避免超时。

让我们用k来表示while循环的迭代次数。 我们知道

A[i]+k*x > A[i-1].  

因此我们可以推断出

k > (A[i-1]-A[i])/x 

使用整数运算,循环周围的迭代次数可以计算为:

k = (A[i-1]-A[i]+x)/x if A[i] <= A[i-1], or 0 otherwise

其次,注意整数溢出。目前尚不清楚X和N的大小,但检查最大值是否会溢出int数据类型。