题目描述
上课的时候总有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情。不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,
只有有限的 D 对同学上课时会交头接耳。同学们在教室中坐成了 M 行 N 列,坐在第 i 行第 j 列的同学的位置是(i,j),为了方便同学们进出,
在教室中设置了 K 条横向的通道,L 条纵向的通道。于是,聪明的小雪想到了一个办法,或许可以减少上课时学生交头接耳的问题:她打算重新摆放桌椅,
改变同学们桌椅间通道的位置,因为如果一条通道隔开了两个会交头接耳的同学,那么他们就不会交头接耳了。
请你帮忙给小雪编写一个程序,给出最好的通道划分方案。在该方案下,上课时交头接耳的学生对数最少。
输入描述
输入第一行,有 5 各用空格隔开的整数,分别是 M,N,K,L,D(2≤N,M≤1000,0≤K<M,0≤L<N,D≤2000)。
接下来 D 行,每行有 4 个用空格隔开的整数,第 i 行的 4 个整数 Xi,Yi,Pi,Qi ,表示坐在位置 (Xi,Yi) 与 (Pi,Qi) 的两个同学会交头接耳
(输入保证他们前后相邻或者左右相邻)。
输入数据保证最优方案的唯一性。
输出描述
输出共两行。
第一行包含 K 个整数,a1,a2,…… ,aK ,表示第 a1 行和 a1+1 行之间、第 a2 行和第 a2+1 行之间、…、第 aK 行和第 aK+1 行之间要开辟通道,
其中 ai < ai+1 ,每两个整数之间用空格隔开(行尾没有空格)。
第二行包含 L 个整数,b1,b2,……, bk ,表示第 b1 列和 b1+1 列之间、第 b2 列和第 b2+1 列之间、…、第 bL 列和第 bL+1 列之间要开辟通道,
其中 bi < bi+1 ,每两个整数之间用空格隔开(行尾没有空格)。
输入
4 5 1 2 3
4 2 4 3
2 3 3 3
2 5 2 4
输出
2
2 4
源码实现
public class 排座椅 {
static int M;
static int N;
static int K;
static int L;
static int D;
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
M = scan.nextInt();
N = scan.nextInt();
K = scan.nextInt();
L = scan.nextInt();
D = scan.nextInt();
int[] res1 = new int[M];//行
int[] res2 = new int[N];//列
for(int i=1;i<=D;i++){
int l1 = scan.nextInt();
int c1 = scan.nextInt();
int l2 = scan.nextInt();
int c2 = scan.nextInt();
if(l1!=l2){
res1[Math.min(l1,l2)-1]++;
}
if(c1!=c2){
res2[Math.min(c1,c2)-1]++;
}
}
scan.close();
//暂存划通道的集合,按下标排好再输出
int[] ans1 = new int[K];
int index1 = 0;
int[] ans2 = new int[L];
int index2 = 0;
while(K>0){
int index = max(res1);
ans1[index1] = index+1;
index1++;
res1[index] = -1;
K--;
}
while (L>0){
int index = max(res2);
ans2[index2] = index+1;
index2++;
res2[index] = -1;
L--;
}
//排序输出
Arrays.sort(ans1);
for(int i:ans1) System.out.print(i+" ");
System.out.println();
Arrays.sort(ans2);
for(int i:ans2) System.out.print(i+" ");
System.out.println();
}
public static int max(int[] arr){//找到最大值返回下标
int maxValue = -0x3f3f3f;
int maxIndex = 0;
for(int i=0;i<arr.length;i++){
if(maxValue<arr[i]){
maxValue = arr[i];
maxIndex = i;
}
}
return maxIndex;
}
}