题目:
应该还有更方便的写法,但太晚了懒得研究就直接丢上来了
思路:实际上代码就是冒泡排序里面塞了个if。用二维数组存数据,一行存要被换的数组a,一行用来标记能被换的位置(这里我把能换的位置标记为1)。然后进排序循环,如果前一个数a[i] > 后一个数a[i+1],且i这个位置在设定的数组里标记为1,则能交换。至于能被换的位置是“索引”还是“第几个数”要看题目示例,这个题目*可爱的*就是第二个。
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//在此输入您的代码...
int n = scan.nextInt();
int m = scan.nextInt();
int[] a = new int[n];
int[] p = new int[m];
//用二维数组标记出能换的索引,第1行为数组a,第二行用1来标记能换的位置(即pi)
int[][] ap = new int[n][2];
for(int i = 0; i < n; i++){
a[i] = scan.nextInt();
ap[i][0] = a[i];
ap[i][1] = 0;
}
for(int i = 0; i < m; i++){
p[i] = scan.nextInt();
}
for(int i = 0; i < m; i++){
int x = p[i];
ap[x-1][1] = 1;//要-1(题目说的应该不是哪个索引能换而是第几个数能换)
}
for(int i = 0; i < n; i++){
for(int j = i+1; j < n; j++){
if(a[i] > a[j] && ap[i][1] == 1){
int t = a[i];
a[i] = a[j];
a[j] = t;
}
}
}
// 检查数组a是否按升序排列
boolean isSorted = true;
for (int i = 0; i < n - 1; i++) { // 修复循环条件,避免i+1越界
if (a[i] > a[i + 1]) {
isSorted = false;
break;
}
}
// 输出结果
if (isSorted) {
System.out.println("YES");
} else {
System.out.println("NO");
}
scan.close();
}
}