文章目录

  • 一、题目解读
    • 1、原题
    • 2、分类
    • 3、题意
    • 4、输入输出格式
    • 5、数据范围
  • 二、题解参考
    • 1、总体思路
    • 2、思路①
      • (1).分析
      • (2).AC代码
  • 三、总结与吐槽
    • 1、评价
    • 2、吐槽
    • 3、后话

一、题目解读

1、原题

HDU.1006 Tick and Tick

2、分类

杂题

3、题意

求[连续运动的]时钟、在111天内满足条件“任意两个指针夹角大于角度DDD”的总时间占111天的百分比。

4、输入输出格式

输入/输出 要求与格式
输入样例个数 通过输入D=−1D=-1D=−1标识输入结束
输入格式(每个样例) 每行输入一个数DDD
输出格式(每个样例) 每行输出一个结果
输出精度 结果精确到小数点后三位

5、数据范围

数据 范围
DDD 0≤D≤120,D∈R0 \leq D \leq 120, D \in \mathbb{R}0≤D≤120,D∈R

二、题解参考

1、总体思路

思路 时间复杂度 具体解释
穷举时分,累加秒长 O(1)O(1)O(1)(每个案例将近10410^4104次语句执行) 穷举12个h、60个m,在每组确定的(h, m)下的1min1min1min内,找出满足题意的可行区间

2、思路①

(1).分析

很显然,时钟表面上只会显示12个小时,因此一天中我们也只需要考虑半天。

给定hhh(时)、mmm(分)、sss(秒),不难得出三者对应指针以12点方向为起点的角度{deg_h=30h+12m+1120sdeg_m=6m+110sdeg_s=6s\begin{cases} deg\_h = 30h + \frac{1}{2}m + \frac{1}{120}s \\ deg\_m = 6m + \frac{1}{10}s \\ deg\_s = 6s \end{cases}⎩⎪⎨⎪⎧​deg_h=30h+21​m+1201​sdeg_m=6m+101​sdeg_s=6s​

由此,很容易得出三个角度差{Δhm=30h+(12−6)m+(1120−110)sΔhs=30h+12m+(1120−6)sΔms=6m+(110−6)s\begin{cases} \Delta hm = 30h + (\frac{1}{2} - 6)m + (\frac{1}{120} - \frac{1}{10})s \\ \Delta hs = 30h + \frac{1}{2}m + (\frac{1}{120} - 6)s \\ \Delta ms = 6m + (\frac{1}{10} - 6)s \end{cases}⎩⎪⎨⎪⎧​Δhm=30h+(21​−6)m+(1201​−101​)sΔhs=30h+21​m+(1201​−6)sΔms=6m+(101​−6)s​

根据题目的要求、加上我们最开始的简化,我们需要找到半天之内所有满足以下条件的时间段:{D≤∣Δhm∣≤360−DD≤∣Δhs∣≤360−DD≤∣Δms∣≤360−D\begin{cases} D \leq | \Delta hm | \leq 360 - D \\ D \leq | \Delta hs | \leq 360 - D \\ D \leq | \Delta ms | \leq 360 - D \end{cases}⎩⎪⎨⎪⎧​D≤∣Δhm∣≤360−DD≤∣Δhs∣≤360−DD≤∣Δms∣≤360−D​

秒针每一分钟就会转动一圈,显然Δhs\Delta hsΔhs和Δms\Delta msΔms都会在0∼3600 \sim 3600∼360之间快速变化,所以满足题述角度的临界时间会特别多,因此想要直接根据角度、寻找某个公式来求出所有的临界情况是几乎不可能的。

考虑到时钟的指针是连续运动的,因此无法穷举所有时、分、秒。但是仔细思考一下,可以知道,虽然秒不可以穷举,但是时、分还是可以穷举的,只要把时、分确定了,这一分钟内秒的范围也就很容易求出来了(只需要解线性不等式组)。

对于每个不等式,我们一般可以求出两组区间,然后求并集。再把每一个不等式的解求一个交集,就可以知道总体的解区间了。虽然这样做逻辑上很合理,但是要实现却不容易,因为并集并出来的可能是空集,可能是单个连续区间,也可能是多个连续子区间。这样的区间概念不方便实现。

于是我们想到了一个办法进行优化——将三个不等式视为三个组,每组有两个区间解,只要将每组中选一个出来,求出三个区间的交集,遍历所有组合,将时间累积起来即可。

(2).AC代码

HDU(C++/G++)AC代码如下:

#include <iostream>
#include <iomanip>
#include <algorithm>using namespace std;double D;struct interval
{double l;double r;
};// 计算满足线性不等式组【D <= as + b <= 360-D】s的解区间,并且要和区间[0, 60]求交集
interval solve(double a, double b)
{// 解不等式组interval tmp;if (a > 0){tmp.l = (D - b) / a;tmp.r = (360 - D - b) / a;}else{tmp.l = (360 - D - b) / a;tmp.r = (D - b) / a;}// 将解区间和[0, 60]求交集if (tmp.l < 0)tmp.l = 0;if (tmp.r > 60)tmp.r = 60;// 排除其他解(例如[-3, -2]、[65, 70]这样的)if (tmp.l >= tmp.r)tmp.l = tmp.r = 0;return tmp;
}// 求两个区间的交集
interval intersection(interval a, interval b)
{interval tmp;tmp.l = max(a.l, b.l);tmp.r = min(a.r, b.r);if (tmp.l >= tmp.r)tmp.l = tmp.r = 0;return tmp;
}// 计算某分钟内的happytime(单位:s)
double get_Happytime(int h, int m)
{// deg_h = 30 * h + 0.5 * m + s /120.0// deg_m = 6 * m + 0.1 * s// deg_s = 6 * sdouble a, b;interval us[3][2];// △hm = 30 * h - 6.5 * m + (1.0 / 120 - 0.1)sa = 1.0 / 120 - 0.1;b = 30 * h - 5.5 * m;us[0][0] = solve(a, b);us[0][1] = solve(-a, -b);// △hs = 30 * h + 0.5 * m + (1.0 / 120 - 6)sa = 1.0 / 120 - 6;b = 30 * h + 0.5 * m;us[1][0] = solve(a, b);us[1][1] = solve(-a, -b);// △ms = 6 * m + (0.1 - 6) * sa = 0.1 - 6;b = 6 * m;us[2][0] = solve(a, b);us[2][1] = solve(-a, -b);// 对三大组不等式组的解区间、每组出一个区间求三个区间的交集,计算时间(单位:s)interval tmp;double res = 0;for (int i = 0; i < 2; ++i)for (int j = 0; j < 2; ++j)for (int k = 0; k < 2; ++k){tmp = intersection(intersection(us[0][i], us[1][j]), us[2][k]);res += (tmp.r - tmp.l);}return res;
}int main()
{ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);while (cin >> D, fabs(D + 1) > 1e-6){double res = 0;for (int h = 0; h < 12; ++h)for (int m = 0; m < 60; ++m)res += get_Happytime(h, m);cout << fixed << setprecision(3) << res * 100 / (12 * 60 * 60) << endl;}return 0;
}

三、总结与吐槽

1、评价

这道题主要考验一些思维。

2、吐槽

说实话,这道题的标题设计在我看来也是有点儿坑的。

题目名字“Tick and Tick”,译为“滴答滴答”,那还不就应该是秒针一秒跳一下的那种指针吗?直接12×60×6012 \times 60 \times 6012×60×60穷举完了不就好了(虽然这样的话就真成了一道水题了)。

但是题目的数据却又表明,这是一个秒针连续运动的时针……

3、后话

哎,Markdown老是设计字体、颜色什么的好心累,黑底皮肤也感觉怪怪的,还是使用最常见的皮肤和格式吧。

懒了,随缘写题解吧,网课太多快肝不动了。

HDU.1006 Tick and Tick相关推荐

  1. HDU 1006 Tick and Tick 解不等式解法

    HDU 1006 Tick and Tick 解不等式解法 一開始思考的时候认为好难的题目,由于感觉非常多情况.不知道从何入手. 想通了就不难了. 能够转化为一个利用速度建立不等式.然后解不等式的问题 ...

  2. hdu 1006 Tick and Tick

    http://acm.hdu.edu.cn/showproblem.php?pid=1006 题意不多说,这题是求一个概率.刚开始的时候我并没有思路,想了颇久,最后还是打算看看题解.网上的题解不好理解 ...

  3. sysClkRateGet();返回系统时钟每秒的tick数量, tick详解!

    操作系统总是基于某个时钟节拍来跑的...这个节拍的得到往往是通过硬件时钟中断得到,一般来说这个中断的优先级就比NMI低一点点,比其他的都高..这个中断是共给操作系统用的,操作系统用他来进行调度啊什么的 ...

  4. hdu1006 Tick and TIck

    给定9个int, beg1 end1 T1 beg2 end2 T2 beg3 end3 T3 三盏灯周期性亮灭,T表示灯的周期,beg,end表示灯变亮的时间和变灭的时间,beg和end都小于T. ...

  5. 【HDOJ】1006 Tick and Tick_天涯浪子_新浪博客

    [题目] http://acm.hdu.edu.cn/showproblem.php?pid=1006 [报告] 感谢学校的张博文学长给我大致讲解了这道题的做法.以及感谢度娘让我找到了一个不错的解法( ...

  6. 从Var Tick角度来对CE电源管理

    从Var Tick角度来对CE电源管理 一.相关的基础知识如下 1.OAL中Timer相关函数说明 1> OALTimerInit 参数: msecPerSysTick: 每个系统调度Tick对 ...

  7. tick timer 间隔_adjtimex修改tick值用法举例

    测试 用户态下内核时钟计数间隔,默认都是100HZ.因此单个tick代表了10^4 us. 可以设置每个tick代表的时钟长度,因此把tick增加1(即增加为10001us)的影响是每天时间快8.64 ...

  8. 什么是Tick 数据?

    一.什么是Tick Data Tick Data本身并不神秘,就是交易所把每只股票(亦或是futures options)的active order book(就是你的委托还存在在交易所里面,但并且没 ...

  9. Linux时间子系统之Tick模拟层(Tick Sched)

    在分析高分辨率定时器的时候曾经提到过,一旦切换到高精度模式后,原来的Tick层就失去作用了,高分辨率定时器层将"接管"对底层定时事件设备的控制.这时,也就意味着,系统中原有的Tic ...

最新文章

  1. 1024程序员节 继续薅羊毛
  2. 技术者的好奇心和惯性
  3. HAProxy的日志配置以及ACL规则实现负载均衡
  4. C#得到CPU的序列号、硬盘序列号、网卡序列号
  5. 经济学与计算机学收入,考研心得,计算机专业跨考经济学复习经验谈
  6. JMeter java.net.SocketException:Operationnotsupported:connect解决方案
  7. LeNet网络分类MINST数据集,附详细代码及注解和B站视频讲解
  8. 计算机系统常见的10个硬件 1故障,计算机十项常见故障
  9. cad找形心插件 lisp_晓东CAD家园-论坛-A/VLISP-[LISP程序]:求形心-谁有求形心的LISP.帮帮忙。时在是太累啦。 - Powered by Discuz!...
  10. Tilera 64核处理器快速上手
  11. Elasticsearch _reindex Alias使用
  12. 通过经纬度计算两点直线距离的计算方法
  13. Pytorch官网一直很卡进不去,离线下载pytorch各类版本安装包方法
  14. latex各种图表制作
  15. jQJQJQJQJQJQ
  16. 6.Spring security中的rememberMe
  17. redission看门狗实现机制一看就懂
  18. word-解决复制相同的word内容,显示行间距差别大的原因
  19. 【搜集】AE滤镜大全
  20. cad计算机绘图等级考试,2017大学cad考试试题「附答案」

热门文章

  1. 2021-08-21
  2. 扫描服务器用户,服务器安全工具(自动扫描后门路径)
  3. mysql多源复制 知乎_技术分享 | MySQL 多源复制场景分析
  4. 平昌一中高考2021成绩查询,2019年四川省平昌中学高考喜报
  5. Python技术知识清单(数据科学)
  6. 【机器学习-西瓜书】六、支持向量机:核技巧;软间隔;惩罚因子C;松弛变量
  7. 目标检测——初始学习率设置的学习笔记
  8. Python——装饰器的学习笔记(legacy)
  9. Adaboost算法的学习笔记~
  10. 模块化思想——粤嵌GEC6818读取图片宽度、高度、色深