地址:http://acm.hdu.edu.cn/showproblem.php?pid=1209
题意:给5个时间(小时:分钟),将之排序。排序规则是按指针锁夹锐角小到大,若夹角相等则按时间早到晚。最后输出中间的那个时间。
mark:题目很简单,角度也很好算:时针每小时走30度,每分钟走0.5度。分针每分钟走6度。做差后取绝对值,再和180比一下,如果大于180,用360减。
为了避免浮点数排序的麻烦,可乘以2倍后排序。3WA。。。排序的时候if语句后面手贱多写了一个;查了半天才查出来。。。
1 # include <stdio.h> 2 # include <stdlib.h> 3 4 5 typedef struct TIME{ 6 int hh, mm ; 7 int ang ; 8 } TIME ; 9 10 11 12 int cmp(const void *a, const void *b) 13 { 14 TIME *p = (TIME*)a, *q = (TIME*)b ; 15 if (p->ang != q->ang) 16 return p->ang - q->ang ; 17 18 if (p->hh != q->hh) return p->hh - q->hh ; 19 return p->mm - q->mm ; 20 } 21 22 23 int abs(int x){return x<0?-x:x;} 24 25 26 int main () 27 { 28 int i, T ; 29 TIME time[5] ; 30 scanf ("%d", &T) ; 31 while (T--) 32 { 33 for(i = 0 ; i < 5 ; i++) 34 { 35 scanf ("%d:%d", &time[i].hh, &time[i].mm) ; 36 time[i].ang = abs((time[i].hh%12)*60+time[i].mm - time[i].mm*12) ; 37 if (time[i].ang > 360) time[i].ang = 720 - time[i].ang ; 38 } 39 qsort(time, 5, sizeof(time[0]), cmp) ; 40 printf ("%02d:%02d\n", time[2].hh, time[2].mm) ; 41 } 42 return 0 ; 43 }