PAT A1095

  A1095这道题的关键在于处理好程序的时间。不然程序非常容易超时。
  参考了一下算法笔记书上的答案。查询的次数过多时,遍历一次完成任务的处理方法值得学习,类似于之前类似的习题A1016答案中的时间递增求时间差的函数,是我没有想到的比较精巧的处理手段。此类习题需要运用好时间轴思想,避免反复遍历,浪费时间。
while(temp.dd < rec[off].dd || temp.hh < rec[off].hh || temp.mm < rec[off].mm) {
        (*time)++;
        (*money)+= toll[temp.hh];
        temp.mm++;
        if(temp.mm >= 60) {
            temp.mm = 0;
            temp.hh++;
        }
        if(temp.hh >= 24) {
            temp.hh = 0;
            temp.dd++;
        }
    }
#include 
#include 
#include 
#include 
#define maxsize 10000
using namespace std;
int mmm=0;
map p;
struct c{
    char pn[8];
    int h,m,s;
    bool state;
}car[maxsize],t,valid[maxsize];
struct l{
    char pn[8];
    int time;
}list[10000];

bool cmp(c c1,c c2){
    int s=strcmp(c1.pn, c2.pn);
    if (s!=0) return s<0;
    else if(c1.h!=c2.h) return c1.h::iterator it;
    for (it=p.begin(); it!=p.end(); it++) {
        if (it->second==maxx) printf("%s ",it->first.c_str());
    }
    printf("%02d:%02d:%02d",maxx/3600,maxx/60%60,maxx%60);
     
    return 0;
}

你可能感兴趣的:(算法笔记)