zoj 2106 Tick and Tick(比较好的数学题目,代码特麻烦,注意精度)

2023-11-08 12:08

本文主要是介绍zoj 2106 Tick and Tick(比较好的数学题目,代码特麻烦,注意精度),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1106

2、题目大意:

一个钟的三个指针在不停的转动,他们已经厌烦了这样,当他们互相的距离角度大于等于D时,他们会很开心,问一天之中他们happy的时间占总时间的概率。
我觉得这是在解不等式,我原来使用的暴力破解,毫无疑问失败了;我们只要找到某一分钟内,他们happy的时间,然后钟每过12个小时相当于43200秒复原一次。因此总时间就是43200白秒,只要求出在这43200的happy时间,答案就知道了;
假设现在的时钟是h小时,m分钟,s秒,给定的角度为degree;则列出happy的不等式有
时针到0时刻的角度的实际值为hw = (h+m/60+s/3600)*30,分针的角度mw = (m+s/60)*6,秒针的角度为sw = s*6;则他们都happy的条件为
degree<|hw -mw|<360 - degree;<1>
degree<|hw - sw|<360 - defgree;<2>
degree<|sw - mw|<360 - degree ;<3>
解这三个不等式即可得到s的区间,把区间的最大值减去最小值就是happy的时间,把每小时每分钟的happy时间再叠加,就是总的happy时间了,再除以总时间的百分比并保留三个小数就是答案。

3、题目:

Tick and Tick

Time Limit: 2 Seconds      Memory Limit: 65536 KB

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


4、AC代码:

#include<stdio.h>
#include<algorithm>
using namespace std;
#define INF 0x7fffffff
double D;
struct node
{double l;double r;
}s[3][2];
node interval(double a,double b)//解方程D<=|a*s-b|<=360-D
{node p;if(a>0){p.l=(D-b)/a;p.r=(360-D-b)/a;}else{p.l=(360-D-b)/a;p.r=(D-b)/a;}if(p.l>=p.r){p.l=0;p.r=0;}if(p.l<0)p.l=0;if(p.r>60)p.r=60;return p;
}node jiao(node a,node b)
{node 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 solve(int h,int m)
{double a,b;/*时针与分针的角度处理解方程式 D<=|hw-mw|<=360-Dhw=(h+m/60+s/3600)*30mw=(m+s/60)*6*/a=1.0/120.0-1.0/10.0;b=30*h+m/2.0-6.0*m;s[0][0]=interval(a,b);s[0][1]=interval(-a,-b);/*时针与秒针的角度处理解方程式 D<=|hw-sw|<=360-Dhw=(h+m/60+s/3600)*30sw=s*6*/a=1.0/120-6.0;b=30*h+m/2.0;s[1][0]=interval(a,b);s[1][1]=interval(-a,-b);/*分针与秒针的角度处理解方程式 D<=|mw-sw|<=360-Dmw=(m+s/3600)*30sw=s*6*/a=0.1-6;b=6*m;s[2][0]=interval(a,b);s[2][1]=interval(-a,-b);//两个绝对值出来的区间取并集,三个并集之间取交集node s1;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(s[0][i],s[1][j]),s[2][k]);res+=s1.r-s1.l;}return res;
}
int main()
{while(scanf("%lf",&D)!=EOF){if(D==-1)break;double ans=0;for(int i=0;i<12;i++){for(int j=0;j<60;j++)ans+=solve(i,j);//i小时j分钟}printf("%.3f\n",100.0*ans/(60*60*12));}return 0;
}

其中的合并取交集参考网上代码,自己写的错了

错的代码:

#include<stdio.h>
#include<algorithm>
using namespace std;
#define INF 0x7fffffff
double D;
struct node
{double l;double r;
}s[3][2];
node interval(double a,double b)//解方程D<=|a*s-b|<=360-D
{node p;if(a>0){p.l=(D-b)/a;p.r=(360-D-b)/a;}else{p.l=(360-D-b)/a;p.r=(D-b)/a;}if(p.l>=p.r){p.l=0;p.r=0;}if(p.l<0)p.l=0;if(p.r>60)p.r=60;return p;
}
node jiao(node a,node b)
{node 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 solve(int h,int m)
{double a,b;/*时针与分针的角度处理解方程式 D<=|hw-mw|<=360-Dhw=(h+m/60+s/3600)*30mw=(m+s/60)*6*/a=1.0/120-1.0/10.0;b=30*h+m/2.0-6.0*m;s[0][0]=interval(a,b);s[0][1]=interval(-a,-b);/*时针与秒针的角度处理解方程式 D<=|hw-sw|<=360-Dhw=(h+m/60+s/3600)*30sw=s*6*/a=1.0/120-6;b=30*h+m/2.0;s[1][0]=interval(a,b);s[1][1]=interval(-a,-b);/*分针与秒针的角度处理解方程式 D<=|mw-sw|<=360-Dmw=(m+s/3600)*30sw=s*6*/a=0.1-6;b=6.0*m;s[2][0]=interval(a,b);s[2][1]=interval(-a,-b);//两个绝对值出来的区间取并集,三个并集之间取交集node s1[20];int k=0;for(int i=0;i<3;i++){if((s[i][0].r>=s[i][1].l) || (s[i][1].r>=s[i][0].l) ){s1[k].l=max(s[i][0].l,s[i][1].l);s1[k].r=max(s[i][0].r,s[i][1].r);k++;}else if(s[i][0].l>=s[i][1].l && s[i][0].r<=s[i][1].r){s1[k]=s[i][1];k++;}else if(s[i][1].l>=s[i][0].l && s[i][1].r<=s[i][0].r){s1[k]=s[i][0];k++;}else{s1[k]=s[i][0];k++;s1[k]=s[i][1];k++;}}node s2=s1[0];for(int i=1;i<k;i++){s2=jiao(s2,s1[i]);}double anss;anss=s2.r-s2.l;return anss;
}
int main()
{while(scanf("%lf",&D)!=EOF){if(D==-1)break;double ans=0;for(int i=0;i<12;i++){for(int j=0;j<60;j++)ans+=solve(i,j);//i小时j分钟}printf("%.3f\n",100.0*ans/(60*60*12));}return 0;
}



这篇关于zoj 2106 Tick and Tick(比较好的数学题目,代码特麻烦,注意精度)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/369748

相关文章

Django开发时如何避免频繁发送短信验证码(python图文代码)

《Django开发时如何避免频繁发送短信验证码(python图文代码)》Django开发时,为防止频繁发送验证码,后端需用Redis限制请求频率,结合管道技术提升效率,通过生产者消费者模式解耦业务逻辑... 目录避免频繁发送 验证码1. www.chinasem.cn避免频繁发送 验证码逻辑分析2. 避免频繁

精选20个好玩又实用的的Python实战项目(有图文代码)

《精选20个好玩又实用的的Python实战项目(有图文代码)》文章介绍了20个实用Python项目,涵盖游戏开发、工具应用、图像处理、机器学习等,使用Tkinter、PIL、OpenCV、Kivy等库... 目录① 猜字游戏② 闹钟③ 骰子模拟器④ 二维码⑤ 语言检测⑥ 加密和解密⑦ URL缩短⑧ 音乐播放

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

Python实现MQTT通信的示例代码

《Python实现MQTT通信的示例代码》本文主要介绍了Python实现MQTT通信的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 安装paho-mqtt库‌2. 搭建MQTT代理服务器(Broker)‌‌3. pytho

MySQL中比较运算符的具体使用

《MySQL中比较运算符的具体使用》本文介绍了SQL中常用的符号类型和非符号类型运算符,符号类型运算符包括等于(=)、安全等于(=)、不等于(/!=)、大小比较(,=,,=)等,感兴趣的可以了解一下... 目录符号类型运算符1. 等于运算符=2. 安全等于运算符<=>3. 不等于运算符<>或!=4. 小于运

MySQL进行数据库审计的详细步骤和示例代码

《MySQL进行数据库审计的详细步骤和示例代码》数据库审计通过触发器、内置功能及第三方工具记录和监控数据库活动,确保安全、完整与合规,Java代码实现自动化日志记录,整合分析系统提升监控效率,本文给大... 目录一、数据库审计的基本概念二、使用触发器进行数据库审计1. 创建审计表2. 创建触发器三、Java

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN