您的位置:首页 > 其它

HDU 1006 Tick and Tick 解不等式解法

2017-05-06 19:13 288 查看
一開始思考的时候认为好难的题目,由于感觉非常多情况。不知道从何入手。

想通了就不难了。

能够转化为一个利用速度建立不等式。然后解不等式的问题。

建立速度,路程,时间的模型例如以下:

/***************************************************************************
*								  *
*	秒钟的速度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));
}
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: