HDU 1006 Tick and Tick 解不等式解法
一開始思考的时候认为好难的题目,由于感觉非常多情况。不知道从何入手。
想通了就不难了。
能够转化为一个利用速度建立不等式。然后解不等式的问题。
建立速度,路程,时间的模型例如以下:
/***************************************************************************
* *
* 秒钟的速度s=6°/s,分针是1/10°/s,时针是1/120°/s *
* 所以相对速度s_m=59/10°/s,s_h=719/120°/s,m_h=120/11°/s *
* 所以相差一度所须要的时间sm=10/59 s/°。sh=120/719 s/°,mh=120/11 s/° *
* 他们差360°的周期为tsm=3600/59 s。tsh=43200/719 s。tmh=43200/11 s *
* 须要相差的角度为n。 *
* rsm>n → n*sm+k1*tsm < t < tsm-n*sm+k1*tsm; *
* rsh>n → n*sh+k2*tsh < t < tsh-n*sh+k2*tsh; *
* rmh>n → n*mh+k3*tmh < t < tmh-n*mh+k3*tmh; *
* 三个条件都满足所占的总时间即为时针、分针、秒针相差角度大于n的总时间 *
* *
***************************************************************************/
以上内容出处: http://acm.hdu.edu.cn/discuss/problem/post/reply.php?postid=4499&messageid=1&deep=0
就是利用中学的公式了:物体1的速度是V1,物体2的速度是V2。那么经过一段时间t,他们的距离差S = V1*t - V2*t
这里的物体就是时针,分针, 秒针。然后就建模成这样一个简单的物理模型。能把这个模型建立起来,一切就攻克了。
当然。这也是最难的地方。
參考一下这个博客:http://www.cnblogs.com/kuangbin/archive/2011/12/04/2275470.html
以下是我的代码:
#include <algorithm>
#include <cstdio>
#include <utility>
using namespace std; class TickAndTick_1
{
void intersectRange(pair<double, double> &rs,
pair<double, double> &a, pair<double, double> &b)
{
rs.first = max(a.first, b.first);
rs.second = min(a.second, b.second);
if (rs.first > rs.second) rs.first = rs.second = 0.0;
} void solveInequality(double a, double b, double D, pair<double, double> &rs)
{
if (a == 0.0) return; pair<double, double> pa;
if (a < 0.0)
{
pa.first = (360.0-b-D) / a;
pa.second = (D-b) / a;
}
else
{
pa.first = (D-b) / a;
pa.second = (360.0-b-D) / a;
}
pair<double, double> sixty(0.0, 60.0);
intersectRange(rs, pa, sixty);
} double happyInMinute(int h, int m, double D)
{
pair<double, double> pas[3][2]; double a = 1.0 / 120.0 - 0.1;
double b = 30.0 * h + m/2.0 - 6.0*m;
solveInequality(a, b, D, pas[0][0]);
solveInequality(-a, -b, D, pas[0][1]); a = 1.0/120 - 6.0;
b = 30*h + m/2.0;
solveInequality(a, b, D, pas[1][0]);
solveInequality(-a, -b, D, pas[1][1]); a = 0.1 - 6;
b = 6 * m;
solveInequality(a, b, D, pas[2][0]);
solveInequality(-a, -b, D, pas[2][1]); double ans = 0.0;
pair<double, double> tmp_1, tmp_2;
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 2; j++)
{
intersectRange(tmp_1, pas[0][i], pas[1][j]); intersectRange(tmp_2, tmp_1, pas[2][0]);
ans += tmp_2.second - tmp_2.first; intersectRange(tmp_2, tmp_1, pas[2][1]);
ans += tmp_2.second - tmp_2.first;
}
}
return ans;
} public:
TickAndTick_1()
{
double D;
while(scanf("%lf",&D) && -1 != D)
{
double ans = 0.0;
int h, m;
for (h = 0; h < 12; h++)
{
for(m = 0; m < 60; m++)
{
ans += happyInMinute(h, m, D);
}
}
printf("%.3lf\n",ans * 100.0 / (60.0 * 60.0 * 12.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 ...
- 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小时内的百分 ...
- hdu6071[最短路+解不等式] 2017多校4
求出所有,从2走到x所需的花费在对 t = 2*min(d1,2, d2,3) 模运算下, 所有剩余系的最短路即可(把一个点拆成 t 个点, 每个点代表一种剩余系), 知道了所有剩余系就可以凑出答案 ...
- 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 ...
随机推荐
- i++ 和++i 的理解 以防面试
根本原理: //模拟 a++ function afterAdd(){ var temp = a; a = a+1; return temp; } //模拟++a; function beforeAd ...
- 【14】vuex2.0 之 mutation 和 action
我们的项目非常简单,当点击+1按钮的时候,count 加1,点击-1按钮的时候,count 减1. 1, mutation The only way to actually change state ...
- 转:Java 动态代理的内部实现机制(大体意思正确,写的还行的一篇文章)
转:Java动态绑定的内部实现机制 JAVA虚拟机调用一个类方法时,它会基于对象引用的类型(通常在编译时可知)来选择所调用的方法.相反,当虚拟机调用一个实例方法时,它会基于对象实际 的类型(只能在运行 ...
- 【UVA10561】Treblecross(SG函数)
题意:有n个格子排成一行,其中一些格子里面有字符X.两个游戏者轮流操作,每次可以选一个空格,在里面放上字符X. 如果此时有3个连续的X出现,则该游戏者赢得比赛.初始条件下不会有3个X连续出现. 判断先 ...
- Docker(三):Docker的基本概念
Docker镜像: Docker镜像就是一个只读模板,例如,一个镜像可以包含Ubuntu操作系统环境,里面安装了Apache或用户需要的其它应用程序. 镜像可以用来创建Docker容器.Docker提 ...
- boost::thread编程-线程中断(转)
原文转自 http://blog.csdn.net/anda0109/article/details/41943691 thread的成员函数interrupt()允许正在执行的线程被中断,被中断的线 ...
- 转 C++的常量引用
C++的常量引用 如果是对一个常量进行引用,则编译器首先建立一个临时变量,然后将该常量的值置入临时变量中,对该引用的操作就是对该临时变量的操作.对常量的引用可以用其它任何引用来初始化:但不能改变. 关 ...
- C#图解教程学习笔记——类相关的概念
一.一些基本概念1. 字段:隶属于类的变量,即类的成员变量.2. 方法:隶属于类的函数,即类的成员函数.3. 实例成员:类的每个实例拥有自己的各个类成员的副本,这些成员称为实例成员. 改变一个实例字段 ...
- 调用Thread.interrupt()方法到底会发生什么?
1. 当线程处于Blocked状态(sleep,wait,join),线程会退出阻塞状态,并抛出一个InterruptedException.park除外,它有响应但是不会抛出异常 2. 当线程处于R ...
- JavaScript的Object
题目 var foo = new Object(); var bar = new Object(); var map = new Object(); map[foo] = "foo" ...