H - Clock(思维+小模拟)

Problem

有个表,给定初始时刻和一些其他时刻,求秒针总共最少转多少度使得经过所有时刻。

Solution

  • 场上唯唯诺诺,场下重拳出击。。。
  • 想了想实际最优情况应该是一直往某个方向转,或者转到某个位置,然后沿反方向走完剩下所有的。
  • 处理时把时间化为秒,去重,特判初始位置在两头时和一遍走完的两种情况,所有的取最优,没啥细节。

Code

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int cir=12*60*60;
int n,tim[100005],fir,minn;
int main()
{
	while(cin>>n)
	{
		minn=1e9;
		for(int i=0,h,m,s;i<=n;i++)
		{
			scanf("%d%d%d",&h,&m,&s);
			if(h>=12) h-=12;
			tim[i]=h*3600+m*60+s;
		}
		fir=tim[0];
		sort(tim,tim+n+1);
		n=unique(tim,tim+n+1)-tim-1;
		tim[n+1]=cir;
		for(int i=0;i<=n;i++)
		{
			if(fir==tim[i])
			{
				fir=i;
				break;
			}
		}
		if(fir==0||fir==n)
        {
            !fir?minn=min(tim[n]-tim[fir],tim[fir]+cir-tim[fir+1]):minn=min(tim[n]-tim[0],cir-tim[fir]+tim[n-1]);
            printf("%d.00\n",minn*6);
            continue;
        }
		for(int i=fir+1;i<=n;i++)
            minn=min(minn,tim[i]-tim[fir]+tim[i]+cir-tim[i+1]);
        for(int i=0;i<fir&&tim[i+1]!=tim[fir];i++)
            minn=min(minn,cir-tim[fir]+2*tim[i]+cir-tim[i+1]);
        for(int i=fir-1;i>=0;i--)
            minn=min(minn,tim[fir]-tim[i]+cir-tim[i]+tim[i-1]);
        for(int i=n;i>fir&&tim[i-1]!=tim[fir];i--)
            minn=min(minn,tim[fir]+2*(cir-tim[i])+tim[i-1]);
        minn=min(minn,min(cir-tim[fir]+tim[fir-1],tim[fir]+cir-tim[fir+1]));
        printf("%d.00\n",minn*6);
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哈希表扁豆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值