HDU1006
一道不等式组的问题 算总时间
题目大意:现在有一个普通时钟,有时针、分针、秒针,秒针不是一秒一秒间断走的,而是连
续走的。给你一个度数D(小于等于120°)。求:24小时中,三个指针超过这个度数的时间占所
有时间的百分比是多少。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | // 思路:之前想的按每秒模拟一遍就可以了。没想到时间是连续的,而不是间隔的,参考了评论 // 区才知道怎么去做。顺便膜拜大神。。。 // 三个指针走的角速度: // 秒针速度S = 6°/s,分针速度M = (1/10)°/s,时针速度H = (1/120)°/s // 这三个指针两两之间的相对速度差为: // 秒时相差S_H = (719/120)°/s,秒分相差S_M = (59/10)°/s,分时相差M_H = (120/11)°/s // 相差一度需要的时间为 // 秒时相差SH = (120/719)s/度,秒分相差SM = (10/59)s/度,分时相差MH = (120/11)s/度 // 相差360°需要的时间为 // 秒时相差tSH = 43200.0/719,秒分相差tSM = 3600.0/59,分时相差tMH = 43200.0/11 // 三者之间都需要最少相差D°才能满足条件,设t为三个指针都满足条件的总时间,则t满足以下 // 条件: // N*SH + k1*tSH < t < tSH - N*SH +k1*tSH // N*SM + k2*tSM < t < tSM - N*SM + k2*tSM // N*MH + k3*tMH < t < tMH - N*MH + k3*tMH // 先求出三指针两两之间第一次满足条件的时间和第一次不满足条件的时间。 // 在对两两指针之间满足条件的开始时间和结束时间进行遍历(三重循环),把所有满足条件的时 // 间累加起来就是所求满足条件的总时间。最后结果为:满足条件的总时间/43200*100。 #include<iostream> #include<algorithm> #include<cstdio> #include<cstring> using namespace std; // 秒针速度 s = 6°/s 分针速度 m = 1/10° /s 时针 h = 1/120° /s const double SH = 719.0 / 120, SM = 59.0 / 10, MH = 11.0 / 120; // 秒时相差S_H = (719/120)°/s,秒分相差S_M = (59/10)°/s,分时相差M_H = (120/11)°/s const double tSH = 43200.0 / 719, tSM = 3600.0 / 59, tMH = 43200.0 / 11; // 相差360°需要的时间为 double Min( double a, double b, double c) { return min(a, min(b, c)); } double Max( double a, double b, double c) { return max(a, max(b, c)); } int main() { double D; while (cin >> D && D != -1) { double bSH, bSM, bMH, eSH, eSM, eMH, Begin, End, Sum = 0; bSH = D / SH; bSM = D / SM; bMH = D / MH; //计算第一次满足条件的时间(开始时间) eSH = (360 - D) / SH; eSM = (360 - D) / SM; eMH = (360 - D) / MH; //计算第一次不满足条件的时间(结束时间) // 主要算法 for ( double b3 = bSH, e3 = eSH; e3 <= 43200.000001; b3 += tSH, e3 += tSH) { // 秒针在最外层 for ( double b2 = bMH, e2 = eMH; e2 <= 43200.000001; b2 += tMH, e2 += tMH) { if (e2 < b3) //判断是否有交集 continue ; if (b2 > e3) break ; for ( double b1 = bSM, e1 = eSM; e1 <= 43200.000001; b1 += tSM, e1 += tSM) { if (e1 < b2 || e1 < b3) continue ; if (b1 > e2 || b1 > e3) break ; Begin = Max(b1, b2, b3); //开始时间取最大,以满足全部要求 End = Min(e1, e2, e3); //结束时间取最小,以满足全部要求 Sum += (End - Begin); } } } printf ( "%.3f\n" , Sum / 432); } return 0; } |
作者:LightAc
出处:https://www.cnblogs.com/lightac/
联系:
Email: dzz@stu.ouc.edu.cn
QQ: 1171613053
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
出处:https://www.cnblogs.com/lightac/
联系:
Email: dzz@stu.ouc.edu.cn
QQ: 1171613053
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Browser-use 详细介绍&使用文档
· 软件产品开发中常见的10个问题及处理方法
· Vite CVE-2025-30208 安全漏洞