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

相关文章

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

使用Spring Cache本地缓存示例代码

《使用SpringCache本地缓存示例代码》缓存是提高应用程序性能的重要手段,通过将频繁访问的数据存储在内存中,可以减少数据库访问次数,从而加速数据读取,:本文主要介绍使用SpringCac... 目录一、Spring Cache简介核心特点:二、基础配置1. 添加依赖2. 启用缓存3. 缓存配置方案方案

MySQL的配置文件详解及实例代码

《MySQL的配置文件详解及实例代码》MySQL的配置文件是服务器运行的重要组成部分,用于设置服务器操作的各种参数,下面:本文主要介绍MySQL配置文件的相关资料,文中通过代码介绍的非常详细,需要... 目录前言一、配置文件结构1.[mysqld]2.[client]3.[mysql]4.[mysqldum

Python多线程实现大文件快速下载的代码实现

《Python多线程实现大文件快速下载的代码实现》在互联网时代,文件下载是日常操作之一,尤其是大文件,然而,网络条件不稳定或带宽有限时,下载速度会变得很慢,本文将介绍如何使用Python实现多线程下载... 目录引言一、多线程下载原理二、python实现多线程下载代码说明:三、实战案例四、注意事项五、总结引