P1056 [NOIP2008 普及组] 排座椅 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
本题要求我们找到分割线使得上课交头接耳的学生数量最少。
因为题目要求我们能横着分割线和竖分割线有限制。
那我们首先应该统计一下每一个横分割线和每一个竖分割线能分割的同学的数量。在这里如果两个人的横坐标相同,那就使用竖分割线,选取竖坐标最小的。然后我们排序对数组排序假如竖分割线
只能选取两个那我们排完序后只要拿着原数组的每一个元素同第三大的数比较比第三大的数大的话就输出即可。
语言表达多有漏洞,上代码
import java.awt.Checkbox;
import java.awt.PrintGraphics;
import java.awt.PageAttributes.OriginType;
import java.math.BigInteger;
import java.security.AlgorithmConstraints;
import java.security.PublicKey;
import java.sql.SQLIntegrityConstraintViolationException;
import java.text.DateFormatSymbols;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.Scanner;
import java.util.TreeSet;
import java.util.function.IntPredicate;
import javax.print.attribute.standard.JobMessageFromOperator;
import javax.sound.sampled.AudioFileFormat;
import javax.swing.plaf.basic.BasicFormattedTextFieldUI;
public class Main{
public static void main(String args[]) {
Scanner sc=new Scanner(System.in);
int a=sc.nextInt();
int b=sc.nextInt();
int c=sc.nextInt();
int d=sc.nextInt();
int e=sc.nextInt();
Integer[] x=new Integer[a+1];//横分割线的数组
Integer[] y=new Integer[b+1];//竖分割线的数组
int[] x2=new int[a+1];//横分割线的数组
int[] y2=new int[b+1];//竖分割线的数组
Arrays.fill(x, 0);//因为是包装类,所以初始为空,我们在这里统一给他们赋值0
Arrays.fill(y, 0);//
while(e>0) {
e--;
int a1=sc.nextInt();
int b1=sc.nextInt();
int a2=sc.nextInt();
int b2=sc.nextInt();
if(a1==a2) {//横坐标一样选取纵坐标小的当分割线
int f=Math.min(b1, b2);
y[f]++;
y2[f]++;
}
else if(b1==b2) {同横坐标
int f=Math.min(a2, a1);
x[f]++;
x2[f]++;
}
}
Arrays.sort(x,new Comparator<Integer>() {//给分割线能分割的同学排序以此获知前几名的数量
@Override
public int compare(Integer o1, Integer o2) {
// TODO Auto-generated method stub
return o2-o1;
}
});
Arrays.sort(y,new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
// TODO Auto-generated method stub
return o2-o1;
}
});
for(int i=0;i<a+1;i++) {//
if(x2[i]>x[c])//如果要选前两名,那么原数组x2只要比排序后的下x【2】大那么输出即可
System.out.print(i+" ");
}
System.out.println();
for(int i=0;i<b+1;i++) {
if(y2[i]>y[d])
System.out.print(i+" ");
}
}
}