HDU 1234 开门人和关门人

 

http://acm.hdu.edu.cn/showproblem.php?pid=1234

 

解题思路:首先按进门时间排序,输出时间最前的人的ID,再按离开时间输出最后的人的ID。

 

#include <iostream> #include <algorithm> #define Max 1001 using namespace std; struct worker { char ID[16]; int StaH,StaM,StaS; int EndH,EndM,EndS; }people[Max]; bool cmpstar(worker a,worker b) { if(a.StaH==b.StaH) { if(a.StaM==b.StaM) return a.StaS<b.StaS; return a.StaM<b.StaM; } return a.StaH<b.StaH; } bool cmpend(worker a,worker b) { if (a.EndH==b.EndH) { if (a.EndM==b.EndM) return a.EndS>b.EndS; return a.EndM>b.EndM; } return a.EndH>b.EndH; } int main() { int N; int i,j,k; char sta[16],end[16]; int hour,min,second; int NumOfPeo; while (scanf("%d",&N)!=EOF) { for (k=0;k<N;k++) { scanf("%d",&NumOfPeo); for (i=0;i<NumOfPeo;i++) { scanf("%s%s%s",&people[i].ID,&sta,&end); hour=min=second=0; for (j=0;j<2;j++) hour=hour*10+(sta[j]-'0'); people[i].StaH=hour; for(++j;j<5;j++) min=min*10+(sta[j]-'0'); people[i].StaM=min; for(++j;j<8;j++) second=second*10+(sta[j]-'0'); people[i].StaS=second; hour=min=second=0; for (j=0;j<2;j++) hour=hour*10+(end[j]-'0'); people[i].EndH=hour; for(++j;j<5;j++) min=min*10+(end[j]-'0'); people[i].EndM=min; for(++j;j<8;j++) second=second*10+(end[j]-'0'); people[i].EndS=second; } sort(people,people+NumOfPeo,cmpstar); printf("%s ",people[0].ID); sort(people,people+NumOfPeo,cmpend); printf("%s/n",people[0].ID); } } return 0; }

你可能感兴趣的:(HDU 1234 开门人和关门人)