三月份省赛选拔赛的题目,一直没有做。
比赛的时候做不出来,当时可能没有想到用scanf,只用了string.h的方法做了很久,做不出来,样例没过,结果只做了三题,排第9.
三月份的时候实在太渣了···
总结:
1.暴力求解最简单,可能代码稍长点。
2.这题要考虑一些点:如果确定时间中心点。画一条时间轴可以看得很清楚
_________|__________|__________|____|___________________________
0:00 5:00 10:00 12:00
对于样例1,正确的找正确钟点是0:00,5:00,10:00。明显,这种情况是不能直接找出他们的时间差绝对值确定的。
所以应该将每个时间点都进行移动,看能不能找到中间时间点。
3.找到中间时间点之后,还要判断它们之间的时间差是否为4:00,如果是,那么久不能确定这个时间。否则,中间点就是答案了。

1 #include <stdio.h> 2 3 inline int ab(int x) { return x >= 0 ? x : -x ;} 4 5 int cal(int x,int y,int z,int &k) 6 { 7 if(ab(x-y)==ab(y-z)) { 8 k = y; return ab(x-y); 9 } 10 else if(ab(x-z)==ab(y-z)) { 11 k = z; return ab(x-z); 12 } 13 else if(ab(x-y)==ab(z-x)) { 14 k = x; return ab(x-y); 15 } 16 else { k = -1 ; return -1;} 17 } 18 int tx[8] , ti[8]; 19 int h[4] , m[4] , re[4]; 20 int main() 21 { 22 int T; 23 scanf("%d",&T); 24 while(T--) 25 { 26 int re[4] , dis; 27 for(int i=1;i<=3;i++){ 28 scanf("%d:%d",&h[i],&m[i]); 29 } 30 for(int i=1;i<=3;i++) 31 { 32 re[i] = h[i]*60+m[i]; 33 } 34 int ok = 0; 35 tx[1] = cal(re[1],re[2],re[3],ti[1]); 36 tx[2] = cal(re[1]+720,re[2],re[3],ti[2]); 37 tx[3] = cal(re[1],re[2]+720,re[3],ti[3]); 38 tx[4] = cal(re[1],re[2],re[3]+720,ti[4]); 39 tx[5] = cal(re[1]-720,re[2],re[3],ti[5]); 40 tx[6] = cal(re[1],re[2]-720,re[3],ti[6]); 41 tx[7] = cal(re[1],re[2],re[3]-720,ti[7]); 42 for(int i=1;i<=7;i++) 43 { 44 if(tx[i] > 0) 45 { 46 ok = 1; 47 if(tx[i] == 4*60) { 48 printf("Look at the sun "); 49 break; 50 } 51 else { 52 printf("The correct time is %d:%02d ", 53 ti[i]/60,ti[i]%60); 54 break; 55 } 56 } 57 } 58 if(!ok) printf("Look at the sun "); 59 } 60 return 0; 61 }