HDU 1006 [Tick Tick]时钟问题

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1006

题目大意:钟表有时、分、秒3根指针。当任意两根指针间夹角大于等于n°时,就说他们是happy的,问一天有百分之多少时间是happy的。

关键思想:两根指针两根指针地考虑,从重合到重合中有且仅有一段连续时间这两根指针是happy的。共有3种组合(时分、分秒、时秒),所以若以时间为横轴,夹角为纵轴,图像为三个连续三角形。另y大于等于n,得到的图像求符合区间的长度。

代码如下:

//多个连续三角区域求符合要求部分的区间长度 
#include <iostream>
using namespace std;

const double sv=6.00, mv=0.10, hv=1./120; 
const double m_s=sv-mv, h_m=mv-hv, h_s=sv-hv;	// 时分、时秒、分秒3组相对速度 

int main(){
	double sum=0;
	double n;
	while(cin>>n&&n!=-1){
		sum=0;
		double bms=n/m_s,ems=(360-n)/m_s,tms=360./m_s;	//时分、时秒、分秒3组起始时间和终止时间以及周期 
		double bhm=n/h_m,ehm=(360-n)/h_m,thm=360./h_m;
		double bhs=n/h_s,ehs=(360-n)/h_s,ths=360./h_s;
		//12小时足矣 。.000001是为了防止漏跑一次。若除去会导致输入为0时结果不是100. 
		for(double a1=bhm,a2=ehm;a2<=43200.000001;a1+=thm,a2+=thm){
			for(double b1=bms,b2=ems;b2<=43200.000001;b1+=tms,b2+=tms){
				if(b2<a1)continue;	//优化,否则TLE 
                if(b1>a2)break;
				for(double c1=bhs,c2=ehs;c2<=43200.000001;c1+=ths,c2+=ths){
					if(c2<a1 || c2<b1)continue;
                    if(c1>a2 || c1>b2)break;
					sum+=
					min(min(a2,b2),c2)-max(max(a1,b1),c1);//找三组都happy的时间,即"最晚始"在"最早终"之前的时间段。 
				}
			}
		}
		printf("%.3lf\n",sum/432);
	}
	return 0;
} 

  

转载于:https://www.cnblogs.com/G-M-WuJieMatrix/p/6363236.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值