PAT Cars on Campus (30)

耗时好几个小时写完这道题,但是结果超时严重。记录一下自己的代码与大神的代码。

我的代码:

package com.company;


import java.text.SimpleDateFormat;
import java.util.*;

class Record implements Comparable<Record>
{
    String carID;
    String time;
    String status;

    @Override
    public int compareTo(Record o) {
        return compareTime(this.time,o.time);
    }
    public static int compareTime(String s1,String s2)
    {
        SimpleDateFormat df=new SimpleDateFormat("HH:mm:ss");
        try{
            Date d1=df.parse(s1);
            Date d2=df.parse(s2);
            long d=d1.getTime()-d2.getTime();
            if(d>0)
                return 1;
            else if(d<0)
                return -1;
            else
                return 0;
        }
        catch (Exception e)
        {
            System.out.println(e.getStackTrace());
        }
        return Integer.MIN_VALUE;
    }
}
class CarInfo
{
    private String carID;
    private ArrayList<Date> inTime;
    private ArrayList<Date> outTime;
    private Date time;
    private int status;       //1表示in,0表示out
    private SimpleDateFormat df;
    CarInfo()
    {
        inTime=new ArrayList<>();
        outTime=new ArrayList<>();
        status=0;
        df=new SimpleDateFormat("HH:mm:ss");
        try {
            time = df.parse("0:0:0");
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    @Override
    public boolean equals(Object obj) {
        CarInfo car=(CarInfo)obj;
        return this.carID.equals(car.carID);
    }

    public void setCarID(String s)
    {
        this.carID=s;
    }
    public String getCarID()
    {
        return this.carID;
    }
    public void addInTime(String s)
    {
        try {
            Date d=df.parse(s);
            //判断该辆车的状态
            if(status==0)
            {
                inTime.add(d);
                status=1;
                calcTime();
            }
            else
            {
                inTime.remove(inTime.size()-1);
                inTime.add(d);
                calcTime();
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
    public ArrayList<Date> getInTime()
    {
        return inTime;
    }
    public void addOutTime(String s)
    {
        try {
            Date d=df.parse(s);
            if(status==1) {
                outTime.add(d);
                status=0;
                calcTime();
            }

        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
    public ArrayList<Date> getOutTime()
    {
        return outTime;
    }
    public int getStatus()
    {
        return status;
    }
    private void calcTime()
    {
        if(inTime.size()==outTime.size())
        {
            long t=time.getTime();
            t+=(outTime.get(outTime.size()-1).getTime()-inTime.get(inTime.size()-1).getTime());
            time.setTime(t);
        }
    }
    public String getStrTime()
    {
        SimpleDateFormat sdf=new SimpleDateFormat("HH:mm:ss");
        return sdf.format(time);
    }

}
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N=sc.nextInt();
        int K=sc.nextInt();
        Record[] records=new Record[N];
        for(int i=0;i<N;i++)
        {
            records[i]=new Record();
            records[i].carID=sc.next();
            records[i].time=sc.next();
            records[i].status=sc.next();
        }
        Arrays.sort(records);
        ArrayList<CarInfo> carInfos=new ArrayList<>();
        for(int i=0;i<N;i++)
        {
            CarInfo tmpCar=new CarInfo();
            tmpCar.setCarID(records[i].carID);
            int index=carInfos.indexOf(tmpCar);
            if(index>=0)
            {
                if(records[i].status.equals("in"))
                {
                    carInfos.get(index).addInTime(records[i].time);
                }
                else if(records[i].status.equals("out"))
                {
                    carInfos.get(index).addOutTime(records[i].time);
                }
            }
            else
            {
                if(records[i].status.equals("in"))
                    tmpCar.addInTime(records[i].time);
                else if(records[i].status.equals("out"))
                    tmpCar.addOutTime(records[i].time);
                carInfos.add(tmpCar);
            }
        }
        SimpleDateFormat df=new SimpleDateFormat("HH:mm:ss");
        for(int i=0;i<K;i++)
        {
            try
            {
                Date queryTime=df.parse(sc.next());
                int cnt=0;
                for(CarInfo car:carInfos)
                {
                    for(int j=0;j<car.getInTime().size();j++)
                    {
                        if(queryTime.compareTo(car.getInTime().get(j))>=0)
                        {
                            if(j==car.getOutTime().size()||queryTime.compareTo(car.getOutTime().get(j))<0)
                                cnt++;
                        }
                    }
                }
                System.out.println(cnt);
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }

        }
        TreeSet<String> longestCar=new TreeSet<>();
        String longestTime="00:00:00";
        int sum=0;
        for(int i=0;i<carInfos.size();i++)
        {
            //System.out.println(carInfos.get(i).getStrTime());
            if(Record.compareTime(carInfos.get(i).getStrTime(),(longestTime))==1)
            {

                sum=1;
                longestTime=carInfos.get(i).getStrTime();
                longestCar.clear();
                longestCar.add(carInfos.get(i).getCarID());
            }
            else if(Record.compareTime(carInfos.get(i).getStrTime(),(longestTime))==0)
            {
                sum++;
                longestCar.add(carInfos.get(i).getCarID());
            }
        }
        for(String s:longestCar)
        {
            System.out.print(s+" ");
        }
        System.out.println(sum);
    }
}
大神的代码:
// fun.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
# include <cstdio>
# include <algorithm>
# include <string>
# include <map>
# include <iostream>
# include <vector>
using namespace std;

const int debug = 0;
const int size = 10050;
const int range = 24 * 60 * 60;

int sumcnt[range];
string ToWatch(int time_point)
{
	char str[50];
	sprintf(str, "%02d:%02d:%02d", time_point / 60 / 60, time_point % (60 * 60) / 60, time_point % 60);
	return string(str);
}
struct Log
{
	string name;
	int type;
	int time;
	void Print()
	{
		cout << name << ' ' << ToWatch(time) << ' ' << type << endl;
	}
	bool match(const Log& cmper) const
	{
		return name == cmper.name&&time<cmper.time&&type == 0 && cmper.type == 1;
	}
	bool operator < (const Log& cmper) const
	{
		if (name != cmper.name)
			return name < cmper.name;
		else if (time != cmper.time)
			return time < cmper.time;
		else
			return type <  cmper.type;
	}
} car_log[size];
int ToDec(int hour, int min, int sec)
{
	return (hour * 60 + min) * 60 + sec;
}

typedef pair<int, int> time_range;
int main()
{
	int i, j;
	int n, k;
	scanf("%d%d", &n, &k);
	string tmp;
	for (i = 0; i<n; i++)
	{
		cin >> car_log[i].name;
		int hour, min, sec;
		scanf("%d:%d:%d", &hour, &min, &sec);
		car_log[i].time = ToDec(hour, min, sec);
		cin >> tmp;
		car_log[i].type = tmp == "out";
	}
	sort(car_log, car_log + n); if (debug)for (i = 0; i<n; i++) car_log[i].Print();
	map<string, int > index;
	int maxrange = -1;
	for (i = 0; i<n; i++)
	{
		if (i + 1<n&&car_log[i].match(car_log[i + 1]))
		{
			index[car_log[i].name] += car_log[i + 1].time - car_log[i].time;
			if (index[car_log[i].name] > maxrange)    
				maxrange = index[car_log[i].name];
			sumcnt[car_log[i].time]++, sumcnt[car_log[i + 1].time]--;
		}
	}
	for (i = 1; i<range; i++)
		sumcnt[i] += sumcnt[i - 1];
	while (k--)
	{
		int hour, min, sec;
		scanf("%d:%d:%d", &hour, &min, &sec);
		printf("%d\n", sumcnt[ToDec(hour, min, sec)]);
	}
	map<string, int>::iterator it;
	for (it = index.begin(); it != index.end(); it++)
		if (it->second == maxrange)
			cout << it->first << ' ';
	cout << ToWatch(maxrange) << endl;
	return 0;
}

总结:革命尚未成功,通知仍需努力!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值