入门篇(2)——算法初步(4.1排序)
1095 Cars on Campus
我的代码
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct Record{
char id[8],status[4];
int time;
}record[10100];
struct Car{
char id[8];
int in,out,total=0,time_long;
}car_record[10100];
bool cmp1(Record a,Record b){
if(strcmp(a.id,b.id)!=0) return strcmp(a.id,b.id)<0;
else return a.time<b.time;
}
bool cmp2(Car a,Car b){
if(a.total!=b.total) return a.total>b.total;
else return strcmp(a.id,b.id)<0;
}
int main(){
int n,k,car_record_num=0;// N (≤10 4), the number of records,
//and K (≤8×10 4) the number of queries
scanf("%d%d",&n,&k);
int hh,mm,ss,temp_time;
for(int i=0;i<n;i++){
scanf("%s %d:%d:%d %s",record[i].id,&hh,&mm,&ss,record[i].status);
temp_time=hh*3600+mm*60+ss;
record[i].time=temp_time;
}
sort(record,record+n,cmp1);
for(int i=0;i<n-1;i++){
if(strcmp(record[i].status,"in")==0&&strcmp(record[i+1].status,"out")==0&&strcmp(record[i].id,record[i+1].id)==0){
strcpy(car_record[car_record_num].id,record[i].id);
car_record[car_record_num].in=record[i].time;
car_record[car_record_num].out=record[i+1].time;
car_record[car_record_num].time_long=record[i+1].time-record[i].time;
i++;
car_record_num++;
}
}
for(int i=0,j=0;i<car_record_num;i++){
if(strcmp(car_record[i].id,car_record[j].id)!=0){
j=i;
}
car_record[j].total+=car_record[i].time_long;
}
for(int i=0;i<k;i++){
int number=0;
scanf("%d:%d:%d",&hh,&mm,&ss);
temp_time=hh*3600+mm*60+ss;
for(int j=0;j<car_record_num;j++){
if(car_record[j].in<=temp_time&&car_record[j].out>temp_time){
number++;
}
}
printf("%d\n",number);
}
sort(car_record,car_record+car_record_num,cmp2);
temp_time=car_record[0].total;
for(int i=0;car_record[i].total==temp_time;i++){
printf("%s ",car_record[i].id);
}
printf("%02d:%02d:%02d",temp_time/3600,temp_time%3600/60,temp_time%60);
}
notes
-
这道题一开始我理解错了题意,
这里是必须按时间顺序排列的下一个out记录才能和in记录匹配!
并且一辆车可能有好多条有效的in/out记录!
我之前以为一辆车只有一条有效的in/out记录。
(文盲的悲哀!)
这里in时刻就已经是在校园里了,out时刻就已经是不在校园里了。
入门篇(2)——算法初步(4.2散列)
notes
- 位图法用的那种定位法是最基础、不加变化的散列函数,此外还有各种散列函数。