问题描述
在原点有一台扫描仪器,它沿着Y轴正方向扫描,一天只有两次扫描次数,有一定数量汽车向X轴负方向前行,每辆汽车当作一个矩形,如下图所示,车头处X轴坐标点为x,所有汽车起始点位于第一象限,长度为L,速度为1,经过时间t时间以后,车头坐标为x-t,车尾坐标为x+L-t,只要扫描到车任何一部分就当扫描成功,请问在哪两个时间点扫描,扫描的汽车数量最多。样例输入(数量,以及每个车的x坐标以及车长L)
4
2 2
3 1
5 2
7 3样例输出(扫描最多的汽车数量)
4问题分析
首先,这是个笔试题目,第一次做由于坐标轴的清晰描述,第一次想法就是计算扫描一次,有没有过Y轴,去用时间叠加计算是否扫描过,但是算法自身将增加了时间观点,比较麻烦。而公司提供的方法抛弃坐标轴问题,其主要为每次以两个车为基点,寻找与这两个基点交叉区域最多的汽车,即扫描两次最多交叉区域最多。
- 代码实现
import java.util.Scanner;
public class Test {
public static int[] a = new int[205];
public static int[] b = new int[205];
public static int num;
public static boolean crossRegin(int front, int back){
return a[back]<=a[front]&&b[back]>=a[front];
}
public static int hitNum(int front, int back){
int re = 0;
for (int i=0;i <= num;i++){
if (crossRegin(front,i) || crossRegin(back,i)){
re++;
}
}
return re;
}
public static void main(String[] args) {
int ans = 0;
Scanner scanner = new Scanner(System.in);
num = scanner.nextInt();
for (int i=1;i <= num;i++){
a[i] = scanner.nextInt();
b[i] = a[i] + scanner.nextInt();
}
for (int i=1;i <= num;i++){
for (int j=i+1;j <= num;j++){
int re = hitNum(i,j);
if(re > ans){
ans = re;
}
}
}
System.out.println(ans);
}
}
测试成功