zoukankan      html  css  js  c++  java
  • 1780

    题目描述

    wls有一个钟表,当前钟表指向了某一个时间。
    又有一些很重要的时刻,wls想要在钟表上复现这些时间(并不需要依次复现)。我们可以顺时针转动秒针,也可以逆时针转动秒针,分针和时针都会随着秒针按规则转动,wls想知道秒针至少转动多少角度可以使每个时刻至少都会被访问一次。
    注意,时钟上的一种时针分针秒针的组合,可以代表两个不同的时间。

    输入

    第一行一个整数n代表有多少个时刻要访问。
    第二行三个整数h,m,s分别代表当前时刻的时分秒。
    最后n行每一行三个整数hi,mi,si代表每个要访问的时刻的时分秒。
    1≤n≤86,400
    0≤h,hi<24
    0≤m,mi,s,si<60

    输出

    输出一行一个数代表秒钟转的角度,答案保留两位小数。

    样例输入

    1
    0 1 0
    0 1 1

    样例输出

    6.00

    Contest1780 - 2019年我能变强组队训练赛第十八场 clock

    题解:把时间排序去重后进行顺时针及逆时针的暴力;

    例如顺时针暴力是:枚举每一个点,让开始时间先顺时针到这个点,再逆时针从这个点到这个点的下一个点;

    逆时针暴力和顺时针差不多,只是把方向都换一下就好,就是先让开始时间先逆时针到一个点,再顺时针从这个点到下一个

     
    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int maxn=1e6+7;
    int Min=1000000007;
    struct node
    {
        int hi,mi,si,miao;//miao是把时间转换为秒来计算
    } Time[100005],start;
    bool cmp(node a,node b)
    {
        return a.miao<b.miao;
    }
    int atob(node a,node b,int f)//时间a到时间b,f=0代表逆时针,f=1代表顺时针
    {
        if(f==0)
        {
            if(b.miao>a.miao)
            {
                return (43200-b.miao+a.miao)*6;
            }
            return (a.miao-b.miao)*6;
        }
        if(b.miao<a.miao)
            return (43200-a.miao+b.miao)*6;
        return (b.miao-a.miao)*6;;
    }
    int main()
    {
        int n;
        scanf("%d",&n);
        scanf("%d %d %d",&start.hi,&start.mi,&start.si);
        if(start.hi>=12)start.hi=start.hi-12;
        start.miao=start.hi*3600+start.mi*60+start.si;
        for(int i=1; i<=n; ++i)
        {
            scanf("%d %d %d",&Time[i].hi,&Time[i].mi,&Time[i].si);
            if(Time[i].hi>=12)Time[i].hi=Time[i].hi-12;
            Time[i].miao=Time[i].hi*3600+Time[i].mi*60+Time[i].si;
        }
        sort(Time+1,Time+n+1,cmp);//按miao进行排序
        int z=1,len=1;
        for(; z<=n; ++z)//找到第一个与开始时间不一样的,就是排序去重的第一步
            if(Time[z].miao!=start.miao)
            {
                Time[1]=Time[z];
                break;
            }
        for(int i=z+1; i<=n; ++i)//排序去重
            if(Time[i].miao!=Time[len].miao&&Time[i].miao!=start.miao)Time[++len]=Time[i];
        int poi=0;
        for(int i=1; i<=len; ++i)//找到第一个大于start的时间
            if(Time[i].miao>start.miao)
            {
                poi=i;
                break;
            }
        if(poi==0)//如果所有时间都小于开始时间
        {
            Min=min(Min,atob(start,Time[1],0));
            for(int i=1; i<len; ++i)
            {
                Min=min(Min,atob(start,Time[i],1)+atob(Time[i],Time[i+1],0));
            }
            Min=min(Min,atob(start,Time[len],1));
            for(int i=len;i>1;--i){
                Min=min(Min,atob(start,Time[i],0)+atob(Time[i],Time[i-1],1));
            }
            printf("%d.00
    ",Min);
            return 0;
        }
        for(int i=poi-1; i<=len; ++i)
        {
            if(i==poi-1)
            {
                int temp=atob(start,Time[poi],0);
                Min=min(Min,temp);
            }
            else if(i==len&&poi==1)
            {
                int temp=atob(start,Time[len],1);
                Min=min(Min,temp);
            }
            else
            {
                int temp=atob(start,Time[i],1),x=i+1;
                if(i==len)x=1;
                temp+=atob(Time[i],Time[x],0);
                Min=min(Min,temp);
            }
        }
        for(int i=1; i<poi; ++i)
        {
            if(i==poi-1)
            {
                int temp=atob(start,Time[poi-1],1);
                Min=min(Min,temp);
            }
            else
            {
                int temp=atob(start,Time[i],1);
                temp+=atob(Time[i],Time[i+1],0);
                Min=min(Min,temp);
            }
        }
        for(int i=poi-1;i>=1;--i){
            if(i-1==0)
                Min=min(Min,atob(start,Time[i],0)+atob(Time[i],Time[len],1));
            else Min=min(Min,atob(start,Time[i],0)+atob(Time[i],Time[i-1],1));
        }
        for(int i=len;i>poi;--i){
            Min=min(Min,atob(start,Time[i],0)+atob(Time[i],Time[i-1],1));
        }
        printf("%d.00
    ",Min);
        return 0;
    }
    

      

  • 相关阅读:
    操作数据库系统(OLTP)和联机分析处理系统(OLAP)的区别
    BI笔记-SSAS部署的几种方式及部署后的SSAS刷新
    概念-数据仓库与元数据
    零基础学Python 3之环境准备
    OFBiz进阶之HelloWorld(五)创建新实体
    OFBIZ bug_create-component ERROR
    OFBIZ bug_ControlServlet.java:233:ERROR
    OFBiz进阶之HelloWorld(三)CRUD操作
    OFBiz进阶之HelloWorld(二)创建热部署模块
    OFBIZ bug_ControlServlet.java:239:ERROR
  • 原文地址:https://www.cnblogs.com/lengsong/p/11563848.html
Copyright © 2011-2022 走看看