题意 :
有一个学校,每天会有很多车进出;给出N条车辆进出情况和M条询问
每条询问输出当前校园有多少辆车,时间从0点24点 最后输出停留最久的车的车牌号和停留时间, 如果有多个,则按字典序输出车牌号
注意 必须要使得所有数据保证以下情况,否则为无效数据:
1 最开始校园里是没车的
2 最后不能有车停留
3 同一辆车连续多次进入 只有最后一个是正确的
4 同一辆车连续多次出去 只有最开始一个是正确的
题解思路:
用map来记录每一个车牌号的下标
首先将所有语句按时间排序 并保存所有询问时间
遍历一次删除不合法语句
再遍历一次 设置一个询问指针
当时间符合要求则输出当前车辆数
用set来保存所有停留最久的车牌号
初解误区:
一开始没有考虑有效数据的情况,最终代码也崩在这里;也没有考虑一车可以多次进入的情况。看来以后要好好读题了。贴一下半成品代码:
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Vector;
public class hello{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
int b = scanner.nextInt();
boolean exitflag = false;
Vector<record> vector = new Vector<record>();
scanner.nextLine();
for (int i = 0; i < a; i++) {
String string = scanner.nextLine();
String[] temp = string.split(" ");
record re = new record(temp[0],temp[1],temp[2]);
exitflag = false;
for (int j = vector.size() -1; j >= 0; j--) {
record rec = vector.get(j);
if (rec.plate.equals(re.plate)) {
if (re.io.equals("in")) {
if (rec.io.equals(re.io)) {
rec.time = re.time;
System.out.println(re.plate+" "+re.time+" "+re.io);
exitflag = true;
}
}
else {
if (rec.io.equals(re.io)) {
System.out.println(re.plate+" "+re.time+" "+re.io);
exitflag = true;
}
}
break;
}
}
if (!exitflag) {
vector.add(re);
}
}
for (Iterator iterator = vector.iterator(); iterator.hasNext();) {
record record = (record) iterator.next();
System.out.println(record.plate+" "+ record.time);
}
String nowtime;
Vector<record> in = new Vector<record>();
Vector<String> maxplate = new Vector<String>();
int max =0;
Iterator iterator = vector.iterator();
record record = null;
boolean quitflag = false;
boolean firstflag = true;
for (int i = 0; i < b; i++) {
nowtime = scanner.nextLine();
System.out.println(nowtime);
quitflag = false;
while(iterator.hasNext()&&!quitflag) {
if (!firstflag) {
if (record.time.compareTo(nowtime) > 0) {
System.out.println(in.size()-1);
for (record re : in) {
System.out.print(re.plate+" ");
}
quitflag = true;
}
else {
record = (record) iterator.next();
//System.out.println(record.time);
}
}
else {
record = (record) iterator.next();
firstflag = false;
}
if (!quitflag) {
if (record.io.equals("in")) {
in.add(record);
}
else {
for (Iterator iterator2 = in.iterator(); iterator2.hasNext();) {
record record2 = (record) iterator2.next();
if (record2.plate.equals(record.plate)) {
//in.remove(record2);
int temp = comp(record.time,record2.time);
if (temp > max) {
max = temp;
maxplate.clear();
maxplate.add(record.plate);
}
else if (temp == max) {
maxplate.add(record.plate);
}
}
}
}
}
}
}
for (String string : maxplate) {
System.out.print(string+" ");
}
System.out.print(totime(max));
scanner.close();
System.out.println(totime(3670));
}
private static int comp(String time, String time2) {
// TODO Auto-generated method stub
return toint(time2)-toint(time);
}
public static int toint(String time) {
String[] temp = time.split(":");
return Integer.parseInt(temp[0])*3600+Integer.parseInt(temp[1])*60+Integer.parseInt(temp[2]);
}
private static String totime(int max) {
Integer hour = max/3600;
Integer minute = max%3600/60;
Integer sec = max%60;
// TODO Auto-generated method stub
return hour.toString()+":"+minute.toString()+":"+sec.toString();
}
static class mycompare implements Comparator<record>{
public int compare(record r1, record r2) {
if(r1.time.compareTo(r2.time)>0) return 1;
else if (r1.time.compareTo(r2.time)<0) {
return -1;
}
else {
return 0;
}
}
}
static class record {
String plate;
String time;
String io;
public record(String plate, String time, String io) {
this.io = io;
this.plate =plate;
this.time = time;
// TODO Auto-generated constructor stub
}
}
}