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;
}