HDU1006

HDU1006、3037、2084、1176题解 最近就只有早起做题,做完就上课,周六日可以做些恶心点点的,平时要上课就只有做做DP,数学题什么的了。 HDU1006,十分恶心的一题,实际上我还不是很懂,看着kuangbin大神的代码基本对着拍,没有什么改进。 题目的意思就是时钟里有三条针,时分秒针,两两超过D度就开心,问一天有百分只几是开心的。 思路就是:模拟,区间交,关键,精度问题,这个针算是连续的~不是60秒动一下分针! /** 阅读详情

       这题是我在HDU上第二次遇到的关于钟表的问题,都很坑人!

        首先,我想大家都会在理解上出问题。其实吧,我觉得这题HDU的思想有问题,钟表是一秒一秒走的,哪有连续时间,表示不解!但题目要求,木有办法了。其次呢,结果要求保留三位有效数字。这也就直接导致了:如果离散的来记录满足条件的时间的话,会在精度上出错!

        现在,来分析下我对这题的做法吧。

题目要求一天(24小时)各个指针的happy time。那么我们该怎么看各个指针呢?不妨让刚开始时各个指针都指在12点的位置,12小时之后又会再回到12点位置,再重复一遍,即可获得24小时总的happy time。显然,记下前12小时的即可啦。

        边贴代码边分析吧。

         ①离散计时(即一秒一秒的计时),结果输入90,输出6.225。(个人认为这种方法没错!)

#include<iostream>
#include<iomanip>
using namespace std;

double calculate(double a,double b)
{
    double temp=(a-b)>0?(a-b):(b-a);
    
    return temp>(360.0-temp)?(360.0-temp):temp;
}

int main()
{
    double degree,flag;
    const double h_degree=360/(12*60*60.0),m_degree=360/(60*60.0),s_degree=360/60.0;
    unsigned int rem_h=1,rem_m=1,rem_s=1,count=0;

    while(cin>>degree && degree>=0.0)
    {
        while(rem_h<=12*60*60)
        {
            if( calculate(rem_h*h_degree,rem_m*m_degree)>=degree )
                if( calculate(rem_m*m_degree,rem_s*s_degree)>=degree )
                    if( calculate(rem_h*h_degree,rem_s*s_degree)>=degree )
                        count++;

            rem_h++;
            rem_m++;
            rem_s++;
            if(rem_s==60+1)
                rem_s=1;
            if(rem_m==60*60+1)
                rem_m=1;
        }

        flag=count/(12*60*60.0)*100.0;
        cout<<setiosflags(ios::fixed);
        cout<<setprecision(3);
        cout<<flag<<endl;

        rem_h=rem_m=rem_s=1;
        count=0;
    }

    return 0;
}


          ②苦于AC无门,也只能找网上大牛们的成品了!(菜鸟的无奈)

           ⑴但第一遍依旧是TLE了,后来明白了可以优化。

#include<iostream>
#include<iomanip>
using namespace std;

//const double w_h=1.0/120,w_m=1./10,w_s=6.0;  //角速度
const double hm=11.0/120,hs=719.0/120,sm=59.0/10;    //相对角速度
const double T_hm=43200.0/11,T_hs=43200.0/719,T_sm=3600.0/59;   //相对周期

inline double min(double a,double b,double c)
{
    double temp=(a>b)?b:a;

    return (c>temp)?temp:c;
}

inline double max(double a,double b,double c)
{
    double temp=(a>b)?a:b;

    return (c>temp)?c:temp;
}

int main()
{
    double degree;
    double x[3],y[3];
    double m[3],n[3];
    double end,begin,sum;

    while(cin>>degree , degree!=-1)
    {
        x[0]=degree/hm;
        x[1]=degree/hs;
        x[2]=degree/sm;

        y[0]=(360-degree)/hm;
        y[1]=(360-degree)/hs;
        y[2]=(360-degree)/sm;

        sum=0.0;
        for(m[0]=x[0],n[0]=y[0];n[0]<=43200.000001;m[0]+=T_hm,n[0]+=T_hm)
        {
            for(m[1]=x[1],n[1]=y[1];n[1]<=43200.000001;m[1]+=T_hs,n[1]+=T_hs)
            {
                for(m[2]=x[2],n[2]=y[2];n[2]<=43200.000001;m[2]+=T_sm,n[2]+=T_sm)
                {
                    begin=max(m[0],m[1],m[2]);
                    end=min(n[0],n[1],n[2]);
                    
                    if(end>begin)
                       sum+=end-begin;
                }
            }
        }

        cout<<setiosflags(ios::fixed)<<setprecision(3)<<sum*100.0/43200<<endl;
    }

    return 0;
}

     

            ⑵AC代码,也用了578MS,险过呀!

              分析下AC代码的思想。

               由于要记录连续时间,那么就利用区间记录,[begin,end]。另外,就拿时针和分针来做例子吧。时针的角速度为w_h=360.0/12*60*60=1.0/120,分针的角速度为w_m=360.0/60*60=1.0/10。两者的相对角速度为w_hm=w_m-w_h,“相对周期”为T_hm=360.0/w_hm。所谓的相对周期就是时针和分针出现重复的相对关系的最小时间。

这样的话就可以把时针和分针,时针和秒针,分针和秒针各自满足条件的集合求交集。显然,代码中利用的是三个for循环来暴力解决。不过有些显然不满足条件的情况即可去除,以减少计算次数。

x[3]和y[3]记录的是第一个开始满足条件的时间和第一个开始不满足条件的时间。m[3],n[3]则是分表根据相对周期来扩大x[3],y[3]以获得所有满足条件的时间集合,并求交集。

#include<iostream>
#include<iomanip>
using namespace std;

//const double w_h=1.0/120,w_m=1./10,w_s=6.0;  //角速度
const double hm=11.0/120,hs=719.0/120,sm=59.0/10;    //相对角速度
const double T_hm=43200.0/11,T_hs=43200.0/719,T_sm=3600.0/59;   //相对周期

inline double min(double a,double b,double c)
{
    double temp=(a>b)?b:a;

    return (c>temp)?temp:c;
}

inline double max(double a,double b,double c)
{
    double temp=(a>b)?a:b;

    return (c>temp)?c:temp;
}

int main()
{
    double degree;
    double x[3],y[3];
    double m[3],n[3];
    double end,begin,sum;

    while(cin>>degree , degree!=-1)
    {
        x[0]=degree/hm;
        x[1]=degree/hs;
        x[2]=degree/sm;

        y[0]=(360-degree)/hm;
        y[1]=(360-degree)/hs;
        y[2]=(360-degree)/sm;

        sum=0.0;
        for(m[0]=x[0],n[0]=y[0];n[0]<=43200.000001;m[0]+=T_hm,n[0]+=T_hm)
        {
            for(m[1]=x[1],n[1]=y[1];n[1]<=43200.000001;m[1]+=T_hs,n[1]+=T_hs)
            {
                if(n[0]<m[1])
                    break;
                if(m[0]>n[1])
                    continue;

                for(m[2]=x[2],n[2]=y[2];n[2]<=43200.000001;m[2]+=T_sm,n[2]+=T_sm)
                {
                    if(n[0]<m[2] || n[1]<m[2])
                        break;
                    if(m[0]>n[2] || m[1]>n[2])
                        continue;

                    begin=max(m[0],m[1],m[2]);
                    end=min(n[0],n[1],n[2]);
                    
                    if(end>begin)
                       sum+=end-begin;
                }
            }
        }

        cout<<setiosflags(ios::fixed)<<setprecision(3)<<sum*100.0/43200<<endl;
    }

    return 0;
}

         欢迎拍砖!

HDU 1006 解题报告 地址 http://acm.hdu.edu.cn/showproblem.php?pid=1006 题意 输入D角度,当时针,分针,秒针两两的角度都大于或等于D时,则三者都很开心,问一天中,三者都开心的时间占了百分之几? 解题思路: 分析 我们都知道12个小时为时针分针秒针的一个周期,所以我们只需要计算12小时内的即可。 错误思路: 遍历12个小时的... 阅读详情

相关推荐

Python实战:用MNE-Python从脑电数据中提取P300成分(附完整代码)

本文提供了一份使用MNE-Python从脑电数据中提取P300成分的完整实战指南。通过详细的代码示例,系统讲解了从环境搭建、数据加载、预处理(滤波、分段、伪迹剔除)到P300波形提取、可视化与参数量化的全流程。重点介绍了如何利用零相位滤波和叠加平均技术,从EEG信号中精准分离出反映认知加工的P300事件相关电位,适用于脑机接口与认知神经科学研究。

weixin_29240343的博客 339

hdu1006(最大连续子序列)

Given a sequence a[1],a[2],a[3]…a[n], your job is to calculate the max sum of a sub-sequence. For example, given (6,-1,5,4,-7), the max sum in this sequence is 6 + (-1) + 5 + 4 = 14. Input The first l...

weixin_43965698的博客 262

SAP SD销售订单抬头自定义字段增强:BADI_SLS_HEAD_SCR_CUS实战指南

SAP ERP系统中的销售订单管理是企业核心业务流程,经常需要扩展标准功能来满足个性化业务需求。在SAP SD模块中,销售订单抬头屏幕的增强是常见需求。通过BADI(Business Add-In)技术,可以在不修改标准代码的前提下,实现自定义字段的添加与数据处理。本文详细介绍了如何使用BADI_SLS_HEAD_SCR_CUS实现销售订单抬头自定义字段,包括函数组子屏幕设计、数据存储表构建以及BADI方法的具体实现。这种增强方式适用于VA01/VA02/VA03等事务,保证了系统升级的兼容性和维护的便捷性

weixin_29758911的博客 350

hdu 1006(简单的深度优先搜索)

//使用深度优先搜索 #include&lt;stdio.h&gt; #include&lt;math.h&gt; #include&lt;string.h&gt; int n; int num[25]; int visited[25]; bool isPrime(int n){ int flag=1; for(int i=2;i&lt;=sqrt(n);i++){ if(n%i==0...

喵咪小白的博客园 526

基于APDL语言的结构优化设计

同理,二次微分值称为二阶值。通俗地讲优化分析,指的找到一种方案可以满足所有的设计要求,而且所需的支出(如重量,面积,体积,应力,费用等)最小。设计方案的任何方面都是可以优化的,比如说:尺寸(如厚度),形状(如过渡圆角的大小),支撑位置,制造费用,自然频率,材料特性等。完成分析文件的建立后,就可以进行优化分析了,如果在交互方式下进行优化的话,最好先在ANSYS数据库中用分析文件建立参数,其优点有:初始参数可以作为一阶分析方法的起点,且对于优化过程参数在数据库中可以在GUI下进行操作,便于定义优化变量。

m0_73816777的博客 1179

GD32_ADC采样+DMA多通道扫描传输

所使用的MCU 片上集成了 12 位逐次逼近式模数转换器模块(ADC),可以采样来自于 16 个外部通道和 2 个内部通道上的模拟信号。这 18 个 ADC 采样通道都支持多种运行模式,采样转换后,转换结果可以按照最低有效位对齐或最高有效位对齐的方式保存在相应的数据寄存器中。我们主要介绍其多通道扫描转换和DMA传输功能,在多个通道轮询采集ad数据,并使用DMA分别保存各个数据值,其能大大提高ADC的工作效率。以下为ADC 模块框图:

Yin_w的博客 8162

HDU-1006

title: HDU-1006 categories: ACM 盲集合求交 tags: 临界最优 屏蔽细节 date: 2020-02-14 11:10:09 一般我们的思维都是先找第一段符合题目的解,然后找第二段第三段,从而理解题目和找出规律。但对于有些题目,规律甚至第一段的解都非常难找,但如果我们知道解位于一个临界集合中,我们就可以不用去找这个解,转而寻找这个临界集合(因为寻找解非常复...

qq_43985303的博客 855

手把手教你用vLLM在昇腾910B上部署Qwen3-Embedding-8B模型(保姆级避坑指南)

本文详细介绍了如何在昇腾910B芯片上使用vLLM推理引擎部署Qwen3-Embedding-8B模型的全流程,包括环境准备、vLLM-ascend定制化安装、模型获取与校验、环境变量配置、服务启动参数优化、性能压测及生产级部署建议。特别针对昇腾生态的开发者,提供了保姆级的避坑指南和实用技巧,帮助实现高效稳定的模型部署。

weixin_28726671的博客 466

HDU1006——Tick and Tick

    这题很滑稽,因为开始我算出0的百分比是200%,这让我想起了那个实验产率300%的化学笑话。好吧,仔细讲讲这题:      有几个逻辑关键点:首先,24h与12h的情况完全一样。并且根据常识,在0:00与12:00两个时刻表盘上三个指针皆重合。并且,三个指针运动相互独立,没有干扰。      很自然能想到我们可以两两考虑这三个表针,算它们重合周期与周期内指针夹角超过n的时间。最...

ShadowFox_的博客 369

huggingface高速下载模型的实战代码

本文主要介绍了huggingface高速下载模型的实战代码,尤其是无法通过国内源进行下载的huggingface模型,希望能对学习大模型的同学们有所帮助。需要特别说明的是,本文的代码是完全原创的,即能够最大限度利用宽度的速度,而且还能实现断点续传。 文章目录 1. 背景 2. 实战代码

herosunly的博客 29万+

杰理JL7033C芯片运行SoundFont音色库教程

本教程介绍如何在杰理JL7033C芯片上移植TinySoundFont音色库,实现MIDI播放功能。关键步骤包括:获取TinySoundFont开源代码,创建音色库声音播放数据流,封装核心功能文件。硬件需配备外部PSRAM和NOR FLASH存储音色库,软件使用杰理SDK和工具链。移植后系统可支持40个voice,满足MIDI播放和电子琴演奏需求。教程详细说明了代码移植过程,包括音色库文件处理、内存配置和音频流水线设置。

qq_42014563的博客 612

HDU1005——Number Sequence,HDU1006——Tick and Tick,HDU1007——Quoit Design

Problem - 1005 代码思路 函数 :主函数 :这个结果最后是超时运算 代码思路 初始化序列:数组用来存储序列的值。和变量分别用于记录循环节的长度和循环节开始的位置。计算序列:检测循环节:函数通过二分查找算法检测序列中的循环节。一旦找到重复的模式(即连续两项相同),它会记录循环节的开始位置()和长度()。输出结果:这种算法特别适用于计算周期性出现的序列,通过检测循环节可以极大地优化计算过程,尤其是在需要频繁查询大索引位置的场景下。Problem - 1006 代码思路

u014114223的博客 1124

基于Simulink的无线充电系统LCC补偿网络建模与控制

本文详细介绍了基于Simulink的无线充电系统LCC补偿网络建模与控制方法。首先分析了无线充电系统面临的核心挑战,提出LCC补偿网络解决方案,阐述了其恒流输出和输入阻抗解耦原理。通过Simulink分步演示了系统建模过程,包括松耦合变压器、LCC+LC补偿网络、功率变换级搭建以及频率跟踪控制实现。仿真结果表明,LCC补偿系统在气隙变化和负载跳变下能保持输出电压稳定(波动±3%),效率达89%。文章还总结了工程实现要点,并探讨了动态充电、多负载系统等扩展应用。该教程为开发高效智能的无线充电系统提供了实用指导

amy_mhd的博客 63

HDU1006 Tick and Tick 数学+枚举

HDU1006 :Tick and Tick 数学+枚举 题意:现在有一个普通的时钟,有时针、分针、秒针,(秒针是连续走,而不是一秒一秒的走)给你一个度数D(小于等于120°)。求:24小时中,三个指针超过这个度数的时间占所有时间的百分比是多少。保留小数点后三位。 import java.text.DecimalFormat; import java.util.Scanner; public c...

匿名攻城狮 871

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

[HDU]1006 Tick and Tick

这是HDU,Obline Judge上的一道题,先来没事,研究的做做,

记得最初的梦想 1124

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

hdu1006(数学+枚举)

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1006 一开始做题的没有考虑到时钟是连续的,导致连续wa了几发,,百思不得其解,看了大佬的博客最后才意识到时钟的连续性。 思路:从时间入手,首先算出时针,分针,秒针相差一度时分别需要的时间  然后开始枚举,三个循环分别枚举时针与分钟,分针与秒针,秒针与时针重合的时间端,然后判断两针角度相差d时,是否其...

zeroliufQ的博客 394

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【中国剩余定理】POJ 1006 & HDU 1370 Biorhythms

题目链接:   http://poj.org/problem?id=1006   http://acm.hdu.edu.cn/showproblem.php?pid=1370 题目大意:   (X+d)%23=a1,(X+d)%28=a2,(X+d)%33=a3,给定a1,a2,a3,d,求最小的X。 题目思路:   【中国剩余定理】   23,28,33互素,可以套中国剩...

PHILIP0917的博客 197

HDU_1006

PROBLEM http://acm.hdu.edu.cn/showproblem.php?pid=1006 note 由于赋值时MAXN没加括号,BUG了半天。。。 #include&lt;stdio.h&gt; #define MAXN 12*60*60 //以12小时来算 double max(double a,double b,double c) { a=(a&gt;b?a:b...

qq_18722465的博客 147

HDU 1006 Tick and Tick (happy模拟)

HDU1006 Tick and Tick Problem Description 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...

矮矮的夏祭的专栏 338

HDU 1006 Tick and Tick

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1006   这题做了好久了,学习了网上的解法后自己写出来了。 就是枚举12*60分钟,看一分钟内有多少秒是happytime,一分钟内解三个不等式得到区间。 具体看代码。 代码有注释很详细的。 #include&lt;stdio.h&gt;#include&lt;math.h&gt;#i...

weixin_33811961的博客 87

HDU 1006 Tick and Tick 解不等式解法

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

weixin_30478923的博客 95

HDU-1006 Tick and Tick 几何

http://acm.hdu.edu.cn/showproblem.php?pid=1006   在参考了0o恋蓝o0 在Discuss中所说后,总算把这一题给弄懂了。题目要求:给定一个角度,问一天中时钟上的三根指针的夹角都大于等于该夹角的总时间占一天总时间的百分比。   思路:1、求出两两指针的相对较速度。        2、然后根据这个相对角速度求出两两之间的周期(即第一次重合到第二次重...

weixin_34187862的博客 149

hdu1006

给你一个角度,求时钟三条

穿袜子的流氓兔的专栏 987
上一篇: HDU1114
下一篇: HDU1028 母函数
lulipeng_cpp
博客等级 码龄15年 169粉丝 130原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值