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++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

MySQL数据库函数之JSON_EXTRACT示例代码

《MySQL数据库函数之JSON_EXTRACT示例代码》:本文主要介绍MySQL数据库函数之JSON_EXTRACT的相关资料,JSON_EXTRACT()函数用于从JSON文档中提取值,支持对... 目录前言基本语法路径表达式示例示例 1: 提取简单值示例 2: 提取嵌套值示例 3: 提取数组中的值注意

CSS3中使用flex和grid实现等高元素布局的示例代码

《CSS3中使用flex和grid实现等高元素布局的示例代码》:本文主要介绍了使用CSS3中的Flexbox和Grid布局实现等高元素布局的方法,通过简单的两列实现、每行放置3列以及全部代码的展示,展示了这两种布局方式的实现细节和效果,详细内容请阅读本文,希望能对你有所帮助... 过往的实现方法是使用浮动加

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav

Java实现状态模式的示例代码

《Java实现状态模式的示例代码》状态模式是一种行为型设计模式,允许对象根据其内部状态改变行为,本文主要介绍了Java实现状态模式的示例代码,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来... 目录一、简介1、定义2、状态模式的结构二、Java实现案例1、电灯开关状态案例2、番茄工作法状态案例

C#比较两个List集合内容是否相同的几种方法

《C#比较两个List集合内容是否相同的几种方法》本文详细介绍了在C#中比较两个List集合内容是否相同的方法,包括非自定义类和自定义类的元素比较,对于非自定义类,可以使用SequenceEqual、... 目录 一、非自定义类的元素比较1. 使用 SequenceEqual 方法(顺序和内容都相等)2.

nginx-rtmp-module模块实现视频点播的示例代码

《nginx-rtmp-module模块实现视频点播的示例代码》本文主要介绍了nginx-rtmp-module模块实现视频点播,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录预置条件Nginx点播基本配置点播远程文件指定多个播放位置参考预置条件配置点播服务器 192.