Tick and Tick

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 10194    Accepted Submission(s): 2859


Problem Description
The three hands of the clock are rotating every second and meeting each other many times everyday. Finally, they get bored of this and each of them would like to stay away from the other two. A hand is happy if it is at least D degrees from any of the rest. You are to calculate how much time in a day that all the hands are happy.
 

Input
The input contains many test cases. Each of them has a single line with a real number D between 0 and 120, inclusively. The input is terminated with a D of -1.
 

Output
For each D, print in a single line the percentage of time in a day that all of the hands are happy, accurate up to 3 decimal places.
 

Sample Input
0
120
90
-1
 

Sample Output
100.000
0.000
6.251
 

思想:

由于要记录连续时间,那么就利用区间记录,[begin,end]。另外,就拿时针和分针来做例子吧。时针的角速度为w_h=360.0/12*60*60=1.0/120,分针的角速度为w_m=360.0/60*60=1.0/10。两者的相对角速度为w_hm=w_m-w_h,“相对周期”为T_hm=360.0/w_hm。所谓的相对周期就是时针和分针出现重复的相对关系的最小时间。

这样的话就可以把时针和分针,时针和秒针,分针和秒针各自满足条件的集合求交集。显然,代码中利用的是三个for循环来暴力解决。不过有些显然不满足条件的情况即可去除,以减少计算次数。

x[3]和y[3]记录的是第一个开始满足条件的时间和第一个开始不满足条件的时间。m[3],n[3]则是分表根据相对周期来扩大x[3],y[3]以获得所有满足条件的时间集合,并求交集。


代码:
#include<iostream>
#include<iomanip>
#include <algorithm> using namespace std; const double hm = 11.0/120,
hs = 719.0/120,
sm = 59.0/10; //相对角速度
const double T_hm = 43200.0/11,
T_hs = 43200.0/719,
T_sm = 3600.0/59; //相对周期 inline double min(double a,double b,double c)
{
double temp[3] = {a,b,c};
return *std::min_element(temp,temp+3);
} inline double max(double a,double b,double c)
{
double temp[3] = {a,b,c};
return *std::max_element(temp,temp+3);
} int main()
{
double degree;
double x[3],y[3];
double m[3],n[3];
double end,begin,sum; while(cin>>degree , degree!=-1)
{
x[0]=degree/hm;
x[1]=degree/hs;
x[2]=degree/sm; y[0]=(360-degree)/hm;
y[1]=(360-degree)/hs;
y[2]=(360-degree)/sm; sum=0.0;
for(m[0]=x[0],n[0]=y[0];n[0]<=43200.000001;m[0]+=T_hm,n[0]+=T_hm)
{
for(m[1]=x[1],n[1]=y[1];n[1]<=43200.000001;m[1]+=T_hs,n[1]+=T_hs)
{
for(m[2]=x[2],n[2]=y[2];n[2]<=43200.000001;m[2]+=T_sm,n[2]+=T_sm)
{
begin=max(m[0],m[1],m[2]);
end=min(n[0],n[1],n[2]); if(end>begin)
sum+=end-begin;
}
}
} cout<<setiosflags(ios::fixed)<<setprecision(3)<<sum*100.0/43200<<endl;
} return 0;
}

用库尼玛 超时自己实现比较

#include<iostream>
#include<iomanip>
using namespace std; const double hm=11.0/120,hs=719.0/120,sm=59.0/10; //相对角速度
const double T_hm=43200.0/11,T_hs=43200.0/719,T_sm=3600.0/59; //相对周期 inline double min(double a,double b,double c)
{
double temp=(a>b)?b:a; return (c>temp)?temp:c;
} inline double max(double a,double b,double c)
{
double temp=(a>b)?a:b; return (c>temp)?c:temp;
} int main()
{
double degree;
double x[3],y[3];
double m[3],n[3];
double end,begin,sum; while(cin>>degree , degree!=-1)
{
x[0]=degree/hm;
x[1]=degree/hs;
x[2]=degree/sm; y[0]=(360-degree)/hm;
y[1]=(360-degree)/hs;
y[2]=(360-degree)/sm; sum=0.0;
for(m[0]=x[0],n[0]=y[0];n[0]<=43200.000001;m[0]+=T_hm,n[0]+=T_hm)
{
for(m[1]=x[1],n[1]=y[1];n[1]<=43200.000001;m[1]+=T_hs,n[1]+=T_hs)
{
if(n[0]<m[1])
break;
if(m[0]>n[1])
continue; for(m[2]=x[2],n[2]=y[2];n[2]<=43200.000001;m[2]+=T_sm,n[2]+=T_sm)
{
if(n[0]<m[2] || n[1]<m[2])
break;
if(m[0]>n[2] || m[1]>n[2])
continue; begin=max(m[0],m[1],m[2]);
end=min(n[0],n[1],n[2]); if(end>begin)
sum+=end-begin;
}
}
} cout<<setiosflags(ios::fixed)<<setprecision(3)<<sum*100.0/43200<<endl;
} return 0;
}

HDU 1006 Tick and Tick 时钟指针问题的更多相关文章

  1. HDU 1006 Tick and Tick(时钟,分钟,秒钟角度问题)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1006 Tick and Tick Time Limit: 2000/1000 MS (Java/Oth ...

  2. hdu 1006 Tick and Tick 有技巧的暴力

    Tick and Tick Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  3. hdu 1006 Tick and Tick

    Tick and Tick Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  4. hdu1006 Tick and Tick

    原题链接 Tick and Tick 题意 计算时针.分针.秒针24小时之内三个指针之间相差大于等于n度一天内所占百分比. 思路 每隔12小时时针.分针.秒针全部指向0,那么只需要计算12小时内的百分 ...

  5. HDU 1006 模拟

    Tick and Tick Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  6. HDU 1006 [Tick Tick]时钟问题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1006 题目大意:钟表有时.分.秒3根指针.当任意两根指针间夹角大于等于n°时,就说他们是happy的, ...

  7. [ACM_模拟] HDU 1006 Tick and Tick [时钟间隔角度问题]

    Problem Description The three hands of the clock are rotating every second and meeting each other ma ...

  8. HDU 1006 Tick and Tick 解不等式解法

    一開始思考的时候认为好难的题目,由于感觉非常多情况.不知道从何入手. 想通了就不难了. 能够转化为一个利用速度建立不等式.然后解不等式的问题. 建立速度,路程,时间的模型例如以下: /******** ...

  9. HDU 1006(时钟指针转角 **)

    题意是说求出在一天中时针.分针.秒针之间距离均在 D 度以上的时间占比. 由于三针始终都在转动,所以要分别求出各个针之间的相对角速度,分别求出三针满足角度差的首次时间,再分别求出不满足角度差的最终时间 ...

随机推荐

  1. Python+Selenium 利用ID,XPath,tag name,link text,partial link text,class name,css,name定位元素

    使用firefox浏览器,查看页面元素,我们以“百度网页”为示例 一.ID定位元素    利用find_element_by_id()方法来定位网页元素对象 ①.定位百度首页,输入框的元素 ②.编写示 ...

  2. 【信号与线性系统】为什么求解零输入响应时转移算子H(p)不能约分,但计算单位冲激响应时却可以约分?

    为什么求零输入响应rZI时转移算子H(p)不能约分? . . . 我们知道,求零输入响应rZI的实质其实是求解微分方程 D(p)r(t) = N(p)e(t) 的解.由于这里 e(t)=0 ,所以这是 ...

  3. 洛谷P1386座位安排

    座位安排 今天,在机房里做了这道题目,我来整理一下思路. 首先读懂题意,这n个人是不需要按1到n来一次安排的,也就是说你可以先安排任意一个人. 那么有一种很好排除的情况,那就是对于大于等于i的作为的需 ...

  4. centos7 启动tomcat卡盾

    vim $JAVA_HOME/jre/lib/security/java.security securerandom.source=file:/dev/random 改为 securerandom.s ...

  5. 复习支持向量机(SVM)没空看书时,掌握下面的知识就够了

    支持向量机(support vector machines, SVM)是一种二类分类模型.它的基本模型是定义在特征空间上的间隔最大的线性分类器:支持向量机还包括核技巧,这使它成为实质上的非线性分类器. ...

  6. Win7 VS2017 NASM编译FFMPEG(2018.12.22)

    今天无意中在gayhub发现个牛逼工程,全VS工程编译FFMPEG库,包括依赖库全是VS生成的,无需Mingw等Linux环境. 简单记录下过程,以防将来重装系统等情况,备忘. https://git ...

  7. python_flask框架学习之路(1)

    1.初识web,了解utl . 术语: scheme://host:port/path?query-string=xxx#yyyy 例子:https://i.cnblogs.com/EditArtic ...

  8. Linux-3.0.8 input subsystem代码阅读笔记

    先乱序记录一下阅读Linux input subsystem代码的笔记. 在input device driver的入口代码部分,需要分配并初始化input device结构,内核提供的API是inp ...

  9. extjs__(grid Panel绑定数据)

    1.修改面板名称 双击My Panel  就可以进行修改 2拖入一个grid  panel绑定数据 3.创建一个model  只是为了创建一个模型  相当于java中的模型层  只是数据的一个标准 4 ...

  10. HDU1262-寻找素数对

    //#include<bits/stdc++.h> #include<map> #include<cstdio> #include<string> #i ...