我期待的不是确切的答案,而是我可以改进解决方案的方式。 目前它的错误,它甚至没有通过一个测试用例。 在一种情况下,它给出了错误的答案,而其他情况则表示超时。
问题
给定大小为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);
}
}
}
对于上面的示例输入,上面代码生成的答案是正确的,但在其他情况下,它会被在线裁判隐藏,并且它会给出超时。 如何解决这个问题?
答案 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数据类型。