1095. Cars on Campus

题意 :

有一个学校,每天会有很多车进出;给出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
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值