判断条件要仔细推敲(记洛谷P1317题WA的经历)
程序员文章站
2024-03-17 21:00:22
...
题目要求
分析
我想的比较复杂,
就是外面有一个大循环,保证遍历数组。
然后是直到下坡我们才能进内层循环,否则往后挪一个(i++)。
进内循环以后必须是上坡才能counter++,并把i赋值为j;如果内层达到sum,就直接退出大循环就行,防卡死……
第一次提交——WA
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int sum = scanner.nextInt();
int[] array = new int[sum];
for (int i = 0; i < sum; i++) {
array[i] = scanner.nextInt();
}
int counter = 0;
outer:
for (int i = 0; i < sum-1; ) {
if (array[i+1] < array[i]) {
for (int j = i+1; j < sum; j++) {
if (j == sum-1) {
break outer;
} else if (array[j] > array[j+1]) {
i = j;
counter++;
break;
}
}
} else {
i++;
}
}
System.out.println(counter);
scanner.close();
}
}
开Debug,大致一看没啥大事……
换一组测试数据:
5
5 4 3 2 1
打印出3,这可不对,开Debug~~
发现一路下坡会直接counter++,这不对啊,进一步发现,下坡会直接满足条件,gg……
原来是条件反了诶,调过来就行!
第二次提交——AC
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int sum = scanner.nextInt();
int[] array = new int[sum];
for (int i = 0; i < sum; i++) {
array[i] = scanner.nextInt();
}
int counter = 0;
outer:
for (int i = 0; i < sum-1; ) {
if (array[i+1] < array[i]) {
for (int j = i+1; j < sum; j++) {
if (j == sum-1) {
break outer;
} else if (array[j] < array[j+1]) {
i = j;
counter++;
break;
}
}
} else {
i++;
}
}
System.out.println(counter);
scanner.close();
}
}
后记
Code写的比较臃肿,时间所限,见谅……
条件要找准,别弄反了诶!