HDU 5705 Clock(2016杭电女生专场1004)——角度追及问题

  题意是给出一个当前的时间和角度a,问从现在开始的下一个时针和分针形成角度a的时间是多少,时间向下取整。

  分析:时针3600s走30°,故120s走1°,分针3600s走360°,故10s走1°,那么每过120s它们就会相差11°,即每过120/11s相差1°,因此设tar是从0:00:00到当前的时间所经过的秒数,cnt也是一样,但是cnt的初始值是a°乘以120/11s,也就是说它是从0:00:00开始的第一个所能形成角度a的时间,然后不断地变更到下一个角度为a的时间即可(所有的时间都先用秒来表示,最后换算成时间),直到超过了tar,那么它就是第一个过了当前时间的并且形成角度a的时间了。但是要注意的一个问题就是,乘以一个分数可能会出现精度问题(事实上在这题它的确出现了),所以把1秒钟再拆成11个小单位,也就是说把所有的时间都换算成更小的单位(即乘以11),这样就可以避免精度问题了。

  具体见代码:

 1 #include <stdio.h>
 2 int main()
 3 {
 4     int h,m,s,a,da,tots=12*3600*11,kase=1;
 5     while(scanf("%d:%d:%d",&h,&m,&s)==3)
 6     {
 7         int tar = 11*(h*3600+m*60+s);
 8         scanf("%d",&a);
 9         da = 360 - 2*a;
10         int cnt = a*120, f = 1;
11         //一开始的位置在它们相差了a°的位置(显然第一次是分针在前)
12         while(cnt<=tar)
13         {
14             if(f)
15             {
16                 f=0;
17                 cnt+=da*120;//第一次追及是分针追(360-2*a)的角度,以再一次形成相差a°的情况
18                             //这一次是分针在时针前面a°
19             }
20             else
21             {
22                 f=1;
23                 cnt+=2*a*120;//再追2*a°,分针又在时针前a°
24                              //此后一直循环往复直到超过当前时间
25             }
26         }
27         if(cnt>=tots) cnt-=tots;
28         int ansh,ansm,anss;
29         ansh = cnt/(3600*11);
30         cnt%=3600*11;
31         ansm=cnt/(60*11);
32         cnt%=60*11;
33         anss=cnt/11;
34         printf("Case #%d: %02d:%02d:%02d\n",kase++,ansh,ansm,anss);
35     }
36     return 0;
37 }
时间: 2024-12-16 02:08:34

HDU 5705 Clock(2016杭电女生专场1004)——角度追及问题的相关文章

HDU 5742 It&#39;s All In The Mind (贪心) 2016杭电多校联合第二场

题目:传送门. 题意:求题目中的公式的最大值,且满足题目中的三个条件. 题解:前两个数越大越好. #include <iostream> #include <algorithm> #include <cstdio> #include <cstring> using namespace std; int gcd(int a,int b) { if(!b) return a; return gcd(b,a%b); } int main() { int t; ci

HDU 5793 A Boring Question (费马小定理) ---2016杭电多校联合第六场

A Boring Question Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 156    Accepted Submission(s): 72 Problem Description There are an equation.∑0≤k1,k2,?km≤n∏1?j<m(kj+1kj)%1000000007=?We define t

HDU 5795 A Simple Nim (博弈) ---2016杭电多校联合第六场

A Simple Nim Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 79    Accepted Submission(s): 48 Problem Description Two players take turns picking candies from n heaps,the player who picks the las

HDU 5762 Teacher Bo (鸽笼原理) 2016杭电多校联合第三场

题目:传送门. 题意:平面上有n个点,问是否存在四个点 (A,B,C,D)(A<B,C<D,A≠CorB≠D)使得AB的横纵坐标差的绝对值的和等于CD的横纵坐标差的绝对值的和,n<10^5,点的坐标值m<10^5. 题解:表面上这道题复杂度是O(n^2)会超时的,而实际上这些坐标差绝对值的和最大是2*10^5,所以复杂度不是O(n^2),而是O(min(n^2,m)),这就是著名的鸽笼原理. #include <iostream> #include <cstdio

HDU 5745 La Vie en rose (DP||模拟) 2016杭电多校联合第二场

题目:传送门. 这是一道阅读理解题,正解是DP,实际上模拟就能做.pij+1 指的是 (pij)+1不是 pi(j+1),判断能否交换输出即可. #include <iostream> #include <algorithm> #include <cstdio> #include<cstring> using namespace std; int t,n; char str1[100009],str2[5009]; char tmp[5009]; int m

HDU 5734 Acperience (公式推导) 2016杭电多校联合第二场

题目:传送门. #include <iostream> #include <algorithm> #include <cstdio> #include <cstring> using namespace std; int gcd(long long a,long long b) { if(!b) return a; return gcd(b,a%b); } int a[100005]; int main() { int T,n; scanf("%d

HDU 5752 Sqrt Bo (思维题) 2016杭电多校联合第三场

题目:传送门. 题意:一个很大的数n,最多开5次根号,问开几次根号可以得到1,如果5次还不能得到1就输出TAT. 题解:打表题,x1=1,x2=(x1+1)*(x1+1)-1,以此类推.x5是不超过long long的,判断输出即可. #include <iostream> #include <cstdio> #include <cstring> #include <cmath> using namespace std; typedef long long

HDU 5744 Keep On Movin (贪心) 2016杭电多校联合第二场

题目:传送门. 如果每个字符出现次数都是偶数, 那么答案显然就是所有数的和. 对于奇数部分, 显然需要把其他字符均匀分配给这写奇数字符. 随便计算下就好了. #include <iostream> #include <algorithm> #include <cstdio> #include <cstring> using namespace std; int main() { int T,n,a; scanf("%d",&T);

hdu 5326 Work(杭电多校赛第三场)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5326 Work Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 583    Accepted Submission(s): 392 Problem Description It’s an interesting experience to