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 度以上的时间占比. 由于三针始终都在转动,所以要分别求出各个针之间的相对角速度,分别求出三针满足角度差的首次时间,再分别求出不满足角度差的最终时间 ...
随机推荐
- mysql5.7高版本加载低版本sql文件,时间不能为0000-00-00格式错误
错误代码:ERROR 1067 (42000): Invalid default value for 解决方式 1. show session variables like '%sql_mode%'; ...
- arm linux和windows 使用tftp传文件
一.在windows 安装tftp客户端 链接:https://pan.baidu.com/s/1sxNciX337DObVmGJmCxICw 提取码:hzvj 在客户端新建一个tftp文件夹 二.关 ...
- Oracle 12c 安装问题及解决方案
1. 介绍 今天在我的开发电脑上安装Oracle12c,电脑环境是windows10家庭中文版,安装的Oracle数据库版本Oracle(12.1.0.2.0) - Standard Edition ...
- 16.The Effect of Advertisement 广告的影响
16.The Effect of Advertisement 广告的影响 (1) The appeal of advertising to buying motives can have both n ...
- mpvue 初体验之改写车标速查小程序
前文 说到我开发了一个简单的小程序叫做 车标速查(代码以及二维码详见 这里),本文简单讲讲如何将这个小程序转为 mpvue 开发(最终 成果 ) mpvue 官网的 文档 真的是非常简单,不,应该说是 ...
- python计时器类
import time as t class MyTimer(): def __init__(self): self.unit = ['年', '月', '日', '时', '分', '秒'] sel ...
- Linux下使用openVPN连接到某个内网
推荐一个网站(比较全的介绍关于openvpn的客户端与服务端的配置) 点击我 此处我介绍我配置openvpn客户端连接的坑 我的机器为kali linux apt-get install openvp ...
- 画线代码V1.0.0
画线代码: 最终效果图: 优点: 1.效果还行,计算量也不大(就一点2维直线一般式能有多少运算量). 缺点: 1.每条线怎么也是建模,可能会有点开销. 2.编辑起来很是麻烦. 代码部分: /***** ...
- delphi压缩与解压_不需要特别的控件
unit unzip; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...
- Encrypt2
begin#33AB6770A8A98127BD0B5A6DAEC68E5E9385C02D24C850B12987FE36CF1A62738174C6FE5336E3B50048E836238582 ...