HDU 1006 Tick and Tick 时钟指针问题
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
0
120
90
-1
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 时钟指针问题的更多相关文章
- HDU 1006 Tick and Tick(时钟,分钟,秒钟角度问题)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1006 Tick and Tick Time Limit: 2000/1000 MS (Java/Oth ...
- hdu 1006 Tick and Tick 有技巧的暴力
Tick and Tick Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- hdu 1006 Tick and Tick
Tick and Tick Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- hdu1006 Tick and Tick
原题链接 Tick and Tick 题意 计算时针.分针.秒针24小时之内三个指针之间相差大于等于n度一天内所占百分比. 思路 每隔12小时时针.分针.秒针全部指向0,那么只需要计算12小时内的百分 ...
- HDU 1006 模拟
Tick and Tick Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- HDU 1006 [Tick Tick]时钟问题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1006 题目大意:钟表有时.分.秒3根指针.当任意两根指针间夹角大于等于n°时,就说他们是happy的, ...
- [ACM_模拟] HDU 1006 Tick and Tick [时钟间隔角度问题]
Problem Description The three hands of the clock are rotating every second and meeting each other ma ...
- HDU 1006 Tick and Tick 解不等式解法
一開始思考的时候认为好难的题目,由于感觉非常多情况.不知道从何入手. 想通了就不难了. 能够转化为一个利用速度建立不等式.然后解不等式的问题. 建立速度,路程,时间的模型例如以下: /******** ...
- HDU 1006(时钟指针转角 **)
题意是说求出在一天中时针.分针.秒针之间距离均在 D 度以上的时间占比. 由于三针始终都在转动,所以要分别求出各个针之间的相对角速度,分别求出三针满足角度差的首次时间,再分别求出不满足角度差的最终时间 ...
随机推荐
- PL/SQL Developer 破解方法~
1.有注册码的方式:亲自测试,立马见效 LicenseNumber : 999 productCode : 46jvnzf74ysf3mqm4hx4tvhcamh8gpe3v5 SeriesNumbe ...
- 关于python的展望
在未接触这门课程以前,我完全对编程一类的操作毫无兴趣.但在短短的两星期时间里,我改变了想法,原因有二.其一是老师幽默,其二是课程实用性高.我希望课程以后可以继续沿用现在由浅入深,给予足够提示的方式,引 ...
- Python从入门到精通之Forth!
Python基本数据类型之列表 补充:range()方法 python2: range 立即创建 xrange for循环的时候才一个一个创建 Python3: range for循环的 ...
- C++入门
<完美C++>第5版 (美)Walter Savitch,Kenrick Mock 萨维奇//默克 著 薛正华,沈庚,韦远科 译 出版社: 电子工业出版社 时间2019/4/11- ...
- P1081 开车旅行(Not Finish)
https://www.luogu.org/problemnew/show/P1081
- 浅谈React数据流管理
引言:为什么数据流管理如此重要?react的核心思想就是:UI=render(data),data就是我们说的数据流,render是react提供的纯函数,所以用户界面的展示完全取决于数据层.这篇文章 ...
- sjms-2 创建型模式
设计模式分类 创建型模式(5种):工厂方法模式.抽象工厂模式.创建者模式.原型模式.单例模式结构型模式(7种):适配器模式.桥模式.组合模式.装饰模式.外观模式.享元模式.代理模式行为型模式(11种) ...
- vi中删除所有查找到的行
vi中删除所有查找到的行 在linux中查找文件,结果中有很多是.svn目录里的,把查找结果放到一个文件里. 用vi打开该文件,按ESC,进入命令行模式,输入 :g/\.svn/d 就可以把所有含”. ...
- 2.0vue导出excel
如果没有插件导入 import FileSaver from 'file-saver' import XLSX from 'xlsx'导入依赖 import FileSaver from 'file- ...
- 11、OpenCV实现图像的灰度变换
1.灰度变换的基本概念 灰度变换指对图像的单个像素进行操作,主要以对比度和阈值处理为目的.其变换形式如下: s=T(r) 其中,T是灰度变换函数:r是变换前的灰度:s是变换后的像素.图像灰度变换的有以 ...