69,371
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MaxRecord 10000
#define MaxQuery 80000
struct records{
char plate_number[8]; //plate numbr of the car
int time; //the intime or the outtime of the car
int in; //in=1means it is a record of car coming in, in=0means it is a record of car going out
int visit;
};
struct records Records[MaxRecord],ValidRecords[MaxRecord]; //first struct array to record the input car info, second to record the valid record
struct valid{
char plate_number[8]; //plate number of the valid info of the car
int park_time; //total paking time of the valid car
};
struct valid Valid[MaxRecord]; //struct array to record the valid total parking time of cars
int N; //number of records;
int K; //number of queries
int size=0; //the size of struct array Valid
int k=0;
int same_car[MaxRecord][MaxRecord]={0};
char* name[N];
//declaration of function
int ToSecond(int hour, int minute, int second);
int Find(char* pla_num);
int cmp1(const void *a, const void *b );
int cmp2(const void *a, const void *b );
int cmp3(const void *a, const void *b );
int main(){
scanf("%d",&N);
scanf("%d",&K);
int i, j,hour, minute, second, record,time,index,total,index2,m;
char pla_num[8];
char status[4];
//read in the records
for(i=0;i<N;i++){
scanf("%s %d:%d:%d %s", pla_num, &hour, &minute, &second, status);
time=hour*3600+minute*60+second;
strcpy(Records[i].plate_number,pla_num);
Records[i].time=time;
Records[i].visit=0;
if(status[0]=='i')
Records[i].in=1;
else if(status[0]=='o')
Records[i].in=0;
}
//sort the struct array Records in ascending order of time
qsort(Records, N, sizeof(struct records), cmp1);
//filter the valid records
i=0;
j=1;
size=0; //the size of struct array Valid
int in=-1;
int out=-1;
int size1=0;//the size of struct array ValidRecords
for(i=0;i<N;i++){
if(Records[i].visit==1)
continue;
for(j=0;j<N;j++){
if(Records[j].visit==1)
continue;
if(strcmp(Records[i].plate_number,Records[j].plate_number)==0&&Records[j].in==1){
in=j;
Records[j].visit=1;
}
else if(strcmp(Records[i].plate_number,Records[j].plate_number)==0&&Records[j].in==0&&in==-1){
Records[j].visit=1;
continue;
}
else if(strcmp(Records[i].plate_number,Records[j].plate_number)==0&&Records[j].in==0&&in!=-1){
ValidRecords[size1++]=Records[in];
ValidRecords[size1++]=Records[j];
Records[in].visit=1;
Records[j].visit=1;
strcpy(pla_num, Records[j].plate_number);
index=Find(pla_num);
if(index!=-1)
Valid[index].park_time=Valid[index].park_time+Records[j].time-Records[in].time;
else{
strcpy(Valid[size].plate_number,pla_num);
Valid[size].park_time=Records[j].time-Records[in].time;
size++;
}
out=-1;
in=-1;
}
}
in=-1;
out=-1;
}
//sort the Valid array in the order of total parking time
qsort(Valid, size, sizeof(struct valid), cmp2);
//ascending order of time
qsort(ValidRecords,size1,sizeof(struct records),cmp1);
//read in the queries and calculate the total num of car and print out
total=0;
j=0;
for(i=0;i<K;i++){
scanf("%d:%d:%d",&hour,&minute,&second);
time=hour*3600+minute*60+second;
while(j<size1&&ValidRecords[j].time<=time){
if(ValidRecords[j].in==1){
total++;
}
else {
total--;
}
j++;
}
printf("%d\n",total);
}
//print the platenumber of largest time
index=size-1;//the last element in valid array
int park_time=Valid[index].park_time;
index2=0;
name[index2++]=Valid[index].plate_number;
while(index>0){
if(park_time==Valid[--index].park_time)
name[index2++]=Valid[index].plate_number;
}
qsort(name, index2, sizeof(char *), cmp3);
for(i=0;i<index2;i++)
printf("%s ",name[i]);
hour=park_time/3600;
minute=park_time%3600/60;
second=park_time%60;
if(hour<10)
printf("0%d:",hour);
else
printf("%d:",hour);
if(minute<10)
printf("0%d:",minute);
else
printf("%d:",minute);
if(second<10)
printf("0%d\n",second);
else
printf("%d\n",second);
return 0;
}
//find whether the car is in the valid array, if so, return the index, if not, return -1
int Find(char* pla_num){
int i;
for(i=0;i<size;i++)
if(strcmp(Valid[i].plate_number,pla_num)==0)
return i;
return -1;
}
//cmp1
int cmp1(const void *a, const void *b ){
return (*(struct records*)a).time-(*(struct records*)b).time;
}
//cmp2
int cmp2(const void *a, const void *b ){
return (*(struct valid*)a).park_time-(*(struct valid*)b).park_time;
}
//cmp3
int cmp3(const void *a, const void *b ){
return strcmp(*(char**)a,*(char**)b);
}