1 solutions
-
0
C :
#include <stdio.h> #include <string.h> char place[400][100],from[100],to[100]; int start[400], d[400][400]; struct tt { int go, dur; } travel[400]; int nt; int comp(struct tt *a, struct tt*b) { if (a->go == b->go) return b->dur-a->dur; return a->go - b->go; }; int s,z,i,j,k,m,h,n,N,T,S,time; main(){ scanf("%d",&N); while (N--) { if (z++) printf("\n"); memset(d,32,sizeof(d)); scanf("%d",&T); s = 0; for (i=0;i<T;i++) { scanf("%d %d:%d",&S,&h,&m); start[s] = h*60 + m; for (j=0;j<S;j++,s++) { scanf(" %s",&place[s]); if (j < S-1) { scanf("%d:%d",&h,&m); start[s+1] = (start[s] + h*60 + m) % (60*24); d[s][s+1] = h*60+m; } } } for (i=0;i<s;i++) for (j=0;j<s;j++) { if (strcmp(place[i],place[j])) continue; d[i][j] = (24*60 + start[j] - start[i]) % (24*60); } for (i=0;i<s;i++) for (j=0;j<s;j++) for (k=0;k<s;k++) { if (d[j][i]+d[i][k] < d[j][k]) d[j][k] = d[j][i]+d[i][k]; } scanf(" %s %s",from,to); nt = 0; for (i=0;i<s;i++) { if (strcmp(place[i],from)) continue; for (j=0;j<s;j++) { if (strcmp(place[j],to)) continue; if (d[i][j] > 32<<24) continue; travel[nt].go = start[i]; travel[nt++].dur = d[i][j]; } } qsort(travel,nt,sizeof(struct tt),comp); for (i=0;i<nt;i++) { for (j=i+1;j<nt;j++) { if (travel[j].go >= travel[i].go && travel[j].go+travel[j].dur <= travel[i].go+travel[i].dur) break; } if (j<nt) continue; for (j=0;j<nt;j++) { if (travel[j].go+60*24 >= travel[i].go && travel[j].go+60*24+travel[j].dur <= travel[i].go+travel[i].dur) break; } if (j<nt) continue; printf("%02d:%02d %d:%02d\n",travel[i].go/60,travel[i].go%60, travel[i].dur/60, travel[i].dur%60); } } }
- 1
Information
- ID
- 18688
- Time
- 1000ms
- Memory
- 128MiB
- Difficulty
- (None)
- Tags
- # Submissions
- 0
- Accepted
- 0
- Uploaded By