Problem Description
The three hands of the clock are rotating every second and meeting each other many times everyday. Finally, they get bored of this and each of them would like to stay away from the other two. A hand is happy if it is at least D degrees from any of the rest. You are to calculate how much time in a day that all the hands are happy.
 
Input
The input contains many test cases. Each of them has a single line with a real number D between 0 and 120, inclusively. The input is terminated with a D of -1.
 
Output
For each D, print in a single line the percentage of time in a day that all of the hands are happy, accurate up to 3 decimal places.
 
Sample Input
0 120 90 -1
 
Sample Output
100.000 0.000 6.251

//用角速度考虑解决问题

#include <cstdio>
#include <math.h>
#include <iostream>
#include <algorithm>

#define V_SEC 6.0 //秒针角速度
#define V_MIN 0.1 //分针角速度
#define V_HOU 1.0/120 //时针角速度

#define A_SEC s*6 //秒针角度
#define A_MIN m*6+s*0.1 //分针角度
#define A_HOU h*30+m*0.5+s/120.0 //时针角度

using namespace std;
struct interval { //区间
double l; //left
double r; //right
};
double Angle; //角度
int s=0; //秒数

interval solve(double v,double a) { //解方程
//Angle<=v*t+a<=360-Angle;,并且和[0,60]取交集
interval p;
if(v>0) {
p.l=(Angle-a)/v;
p.r=(360-Angle-a)/v;
} else {
p.l=(360-Angle-a)/v;
p.r=(Angle-a)/v;
}
if(p.l< 0)p.l= 0;
if(p.r>60)p.r=60;
if(p.l>=p.r)p.l=p.r=0;
return p;
}

interval jiao(interval a,interval b) {
interval p;
p.l=max(a.l,b.l);
p.r=min(a.r,b.r);
if(p.l>=p.r)p.l=p.r=0;
return p;
}

double happytime(int h,int m) { //计算h时m分 满足题意的秒数
double v_diff;//速度差
double a_diff;//角度差
interval s0[3][2];
interval s1;
/*解方程 Angle<=|hh-mm|<=360-Angle*/
v_diff=V_HOU-V_MIN;
a_diff=A_HOU-A_MIN;//时针分针夹角
s0[0][0]=solve( v_diff, a_diff);
s0[0][1]=solve(-v_diff,-a_diff);
/*解方程 Angle<=|hh-ss|<=360-Angle*/
v_diff=V_HOU-V_SEC;
a_diff=A_HOU-A_SEC;//时针秒针夹角
s0[1][0]=solve( v_diff, a_diff);
s0[1][1]=solve(-v_diff,-a_diff);
/*解方程 Angle<=|mm-ss|<=360-Angle*/
v_diff=V_MIN-V_SEC;
a_diff=A_MIN-A_SEC;//分针秒针夹角
s0[2][0]=solve( v_diff, a_diff);
s0[2][1]=solve(-v_diff,-a_diff);
/*
六个区间,选三个取交集
因为绝对值的式子得到的两个区间要并,而三个不同表达式
的区间要交,故这样做
*/
double res=0;
for(int i=0; i<2; i++)
for(int j=0; j<2; j++)
for(int k=0; k<2; k++) {
s1=jiao(jiao(s0[0][i],s0[1][j]),s0[2][k]);
res+=s1.r-s1.l;
}
return res;
}

int main() {
int h,m;
while(scanf("%lf",&Angle)) {
if(Angle==-1)break;
double res=0;
for(h=0; h<12; h++)
for(m=0; m<60; m++)
res+=happytime(h,m);
printf("%.3lf\n",res*100.0/43200);
}
}

//没有找到恰当的方法解决问题,思考角度不够

acm--1006的更多相关文章

  1. 2016 ACM/ICPC Asia Regional Dalian Online 1006 /HDU 5873

    Football Games Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)To ...

  2. 武汉科技大学ACM:1006: 我是老大

    Problem Description 今年是2021年,正值武汉科技大学 ACM俱乐部成立10周年.十周年庆祝那天,从ACM俱乐部走出去的各路牛人欢聚一堂,其乐融融.庆祝晚会上,大家纷纷向俱乐部伸出 ...

  3. 武汉科技大学ACM:1006: 华科版C语言程序设计教程(第二版)例题4.17

    Problem Description 输入一个整数,求它的素数因子.并按照格式输出. Input 一个整数n.(2<=n<=100) Output n=a*b*c*... (a,b,c为 ...

  4. 武汉科技大学ACM :1006: 华科版C语言程序设计教程(第二版)习题7.15

    Problem Description 输入n个字符串(n<=100),输出其中最长的串,如果有多个则取最先找到的那一个. Input 多组测试数据. 每组测试数据第一行包含一个整数n,表示一共 ...

  5. 武汉科技大学ACM :1006: 零起点学算法25——求两点之间的距离

    Problem Description 输入平面坐标系中2点的坐标,输出它们之间的距离 Input 输入4个浮点数x1 y1 x2 y2,分别是点(x1,y1) (x2,y2)的坐标(多组数据) Ou ...

  6. 武汉科技大学ACM :1006: A+B for Input-Output Practice (VI)

    Problem Description Your task is to calculate the sum of some integers. Input Input contains multipl ...

  7. ACM学习历程—BestCoder 2015百度之星资格赛1006 单调区间(组合数学)

    Problem Description 百小度最近在逛博客,然后发现了一个有趣的问题. 如下图所示,是一个12 位数014326951987 , 它的数字先逐渐变大, 然后变小,再变大,接着变小,又变 ...

  8. SCNU ACM 2016新生赛初赛 解题报告

    新生初赛题目.解题思路.参考代码一览 1001. 无聊的日常 Problem Description 两位小朋友小A和小B无聊时玩了个游戏,在限定时间内说出一排数字,那边说出的数大就赢,你的工作是帮他 ...

  9. 【转】ACM博弈知识汇总

    博弈知识汇总 转自:http://www.cnblogs.com/kuangbin/archive/2011/08/28/2156426.html 有一种很有意思的游戏,就是有物体若干堆,可以是火柴棍 ...

  10. acm数学(转)

    这个东西先放在这吧.做过的以后会用#号标示出来 1.burnside定理,polya计数法    这个大家可以看brudildi的<组合数学>,那本书的这一章写的很详细也很容易理解.最好能 ...

随机推荐

  1. JSTL数据格式化

    日期表示 <fmt:formatDate value="${DATE1}" pattern="yyyy-MM-dd hh:mm:ss" type=&quo ...

  2. Java从入门到精通——数据库篇Mongo DB 导出,导入,备份

    一.概述    本篇博客为大家讲述一下Mongo DB是如何导入导出数据,还有就是备份数据的.    在下面操作的时候需要把Mongo DB的服务端打开才能操作. 二.导出.    MongoDB的导 ...

  3. CentOS7 下安装 SublimeText3

    原文地址:http://www.sundabao.com/centos-%E5%AE%89%E8%A3%85sublime-text-3/ Centos 安装Sublime text 3 Centos ...

  4. Apache服务器运维笔记(3)----容器部分

    1.<IfModule>容器 <IfModule>容器作用于模块,它会首先判断模块是否载入,然后再决定是否进行处理,也就是说只有当判断结果为真时才会执行容器内的指令,相反如果为 ...

  5. Springboot基础知识

    1.@RestController注解 Spring4之后新加入的注解,@RestController是@ResponseBody和@Controller的组合注解.(返回json需要@Respons ...

  6. 浮动属性(float)

    (1.浮动是一种脱离标准文档流的形式. 作用:浮动就是用来制作多个盒子并排显示,也能设置宽高,负责网页排版 1 float:left;  左浮动 2 float:right; 右浮动 3 float: ...

  7. 向Github提交更改的代码

    更改了本地的某一文件的代码,那么如何覆盖Github上的同一文件代码呢?请看以下步骤: 1.先用 git status 看你更改了哪些文件: 2.然后 git add 你想要提交的更改的文件 或者 g ...

  8. Java任务调度框架Quartz入门

    Quartz[kwɔːts]:石英,其框架和名字一样简单朴素又不失魅力,在Java程序界,Quartz大名鼎鼎,很多Java应用几乎都集成或构建了一个定时任务调度系统,Quartz是一个定时任务调度框 ...

  9. SQL Server ->>监控和管理Tempdb

    Tempdb作为一个公共数据库,存储着一些临时的数据.有些是用户自己创建的,有些是SQL Server自己创建的.Tempdb空间被使用的一些常见场景有 用户自定义:临时表和表变量.游标. SQL S ...

  10. SQL Server ->> FileTable

    FileTable是SQL Server 2012的新特性之一.它是基于SQL Server 2008的FILESTREAM特性上而来的,允许我们把Windows文件存储在SQL Server中,让S ...