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

题目描述

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\n",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\n",Min);
    return 0;
}

  

原文地址:https://www.cnblogs.com/lengsong/p/11563848.html

时间: 2024-07-29 17:24:50

1780 - 2019年我能变强组队训练赛第十八场的相关文章

Contest1657 - 2019年我能变强组队训练赛第十四场

Contest1657 - 2019年我能变强组队训练赛第十四场 Similarity of Subtrees #include <bits/stdc++.h> using namespace std; typedef unsigned long long ull; typedef long long ll; const int maxn=100100; ull ha[maxn]; vector<int>E[maxn]; unordered_map<ull,int>m;

Contest1828 - 2019年我能变强组队训练赛热身赛

#include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 1006; const ll mod=1000000007; int T; int n,m; ll k; ll dp[1005][6],a[maxn]; ll gdp[1005][6]; //ll ans; char f[maxn]; int main() { //freopen("1.txt","

Contest1814 - 2019年我能变强组队训练赛第七场

Scores of Final Examination On-Screen Keyboard Tally Counters Balance Scale #pragma GCC optimize(3,"Ofast","inline") #include <bits/stdc++.h> using namespace std; typedef long long ll; unordered_map<ll,bool> m1; int n,m,cnt

Contest1539 - 2019年我能变强组队训练赛第十一场

Greater New York 2012 Hailstone HOTPO #pragma GCC optimize(3,"Ofast","inline") #include <bits/stdc++.h> using namespace std; typedef long long ll; int main() { ll n; int T; cin>>T; while(T--) { ll k; scanf("%lld %lld&q

备战省赛组队训练赛第十六场(UPC)

传送门 题解: by 鲁东大学 (提取码:8972) 原文地址:https://www.cnblogs.com/QLU-ACM/p/10803598.html

2019年第二阶段我要变强个人训练赛第十七场

1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const ll mod=1e9+7; 5 const int N=2e6+10; 6 ll c[N],b[N]; 7 ll n,k,a,ans; 8 ll quick(ll a,ll b){ 9 ll res=1; 10 while (b){ 11 if (b&1){ 12 res=res*a%mod; 13 } 14 a=a*a%mo

UPC2018组队训练赛第七场

题目来自ICPC 2017 Japan Tsukuba A题:Secret of Chocolate Poles 有三种巧克力,分别是厚度为1的白色巧克力,厚度为1或者k的黑色巧克力.要求把巧克力放到高度为 l 的盒子里,并且要黑白相间,底部和顶部必须都是黑色的 当l=1,ans=1:当l<k,ans=(l-1)/2+1:当l=k,ans=(l-1)/2+2;当l>k时,就可以转化成排列组合问题了,枚举厚度为k的黑色巧克力数目i,然后对于每一种情况,再枚举厚度为1的黑色巧克力的数目j,那么此时

2016CCPC东北地区大学生程序设计竞赛 (2018年8月22日组队训练赛)

题目链接:http://acm.hdu.edu.cn/search.php?field=problem&key=2016CCPC%B6%AB%B1%B1%B5%D8%C7%F8%B4%F3%D1%A7%C9%FA%B3%CC%D0%F2%C9%E8%BC%C6%BE%BA%C8%FC+-+%D6%D8%CF%D6%C8%FC&source=1&searchmode=source A题题目: 题意: 生成一棵最小生成树,边权值为两个节点的最小公倍数. 思路: 由最小公倍数的和最大公约

2018年第四阶段组队训练赛第三场(BAPC2017 Preliminaries)

D.Disastrous Doubling 题目描述 A scientist, E. Collie, is going to do some experiments with bacteria.Right now, she has one bacterium. She already knows that this species of bacteria doubles itself every hour. Hence, after one hour there will be 2 bacter