Clock
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6807 Accepted Submission(s): 2156
Problem Description
There is an analog clock with two hands: an hour hand and a minute hand. The two hands form an angle. The angle is measured as the smallest angle between the two hands. The angle between the two hands has a measure that is greater than or equal to 0 and less than or equal to 180 degrees.
Given a sequence of five distinct times written in the format hh : mm , where hh are two digits representing full hours (00 <= hh <= 23) and mm are two digits representing minutes (00 <= mm <= 59) , you are to write a program that finds the median, that is, the third element of the sorted sequence of times in a nondecreasing order of their associated angles. Ties are broken in such a way that an earlier time precedes a later time.
For example, suppose you are given a sequence (06:05, 07:10, 03:00, 21:00, 12:55) of times. Because the sorted sequence is (12:55, 03:00, 21:00, 06:05, 07:10), you are to report 21:00.
Input
The input consists of T test cases. The number of test cases (T) is given on the first line of the input file. Each test case is given on a single line, which contains a sequence of five distinct times, where times are given in the format hh : mm and are separated by a single space.
Output
Print exactly one line for each test case. The line is to contain the median in the format hh : mm of the times given. The following shows sample input and output for three test cases.
Sample Input
3 00:00 01:00 02:00 03:00 04:00 06:05 07:10 03:00 21:00 12:55 11:05 12:05 13:05 14:05 15:05
Sample Output
02:00 21:00 14:05
Source
其实本题是一道简单的计算题:
时针:60分钟走一格,一格为360°/12=30°,所以时针的速度为30°/h,即0.5°/min
分针:60分钟走一圈,所以分针的速度为360°/60=6°/min
随后便可以根据其速度来解题了
代码如下:
#include<stdio.h> #include<math.h> #include<iostream> #include<algorithm> using namespace std; struct temp { int h; int m; double angle; }a[5]; int cmp(temp x,temp y) { if(x.angle==y.angle) //角度相同,时间晚的在前面 { if(x.h==y.h) return x.m>y.m; return x.h>y.h; } return x.angle>y.angle;//角度小的在前面 } int main() { int T; scanf("%d",&T); getchar(); while(T--) { double angle,angle_h,angle_m; int h,m,i; for(i=0;i<5;i++) { scanf("%d:%d",&h,&m); angle_h=30*(h%12)+0.5*m; //计算时针的角度 angle_m=6*m;//计算分针的角度 angle=abs(angle_h-angle_m);//夹角 if(angle>180) //超过180°的情况 angle=360-angle; a[i].h=h; a[i].m=m; a[i].angle=angle; //printf("%02d:%d %lf\n",a[i].h,a[i].m,a[i].angle); } sort(a,a+5,cmp);//排序 printf("%02d:%02d\n",a[2].h,a[2].m); //按格式输出 } return 0; }