【模拟】Clock
2024-10-06 05:42:05
Clock
题目描述
wls有一个钟表,当前钟表指向了某一个时间。
又有一些很重要的时刻,wls想要在钟表上复现这些时间(并不需要依次复现)。我们可以顺时针转动秒针,也可以逆时针转动秒针,分针和时针都会随着秒针按规则转动,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
第二行三个整数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
【题解】
我把这个环复制了三个,把每一个时刻当作环上的每一个点,把环展开成三份。
分三种情况:
1、全往顺时针,或者全往逆时针。
2、先往顺时针,再往逆时针。
3、先往逆时针,再往顺时针。
#include<bits/stdc++.h>
using namespace std;
const int N = 3e5+;
const int M = ;
int a[N],n;
int main()
{ //cout << -1 % 10 << endl ;
ios_base :: sync_with_stdio(false);
cin.tie(NULL) , cout.tie(NULL);
int h , mi , s ;
cin >> n ;
cin >> h >> mi >> s ;
int Start = h * + mi * + s ;
if( Start >= M ) Start -= M ;
int m = ; //cout << "####" << endl; for( int i = ,u,v,w ; i<n ; i++ ){
cin >> u >> v >> w ;
int tmp = (u * + v * + w) ;
if( tmp >= M ) tmp -= M ;
if( Start == tmp ) continue ;
else {
a[m++] = tmp ;
}
} sort( a , a + m ); for( int i = ; i < m ; i++ ){
a[i+m] = a[i] + ;
a[i+*m] = a[i] + ;
}
if( m == ){
//printf("####\n");
printf("0.00\n");
}else{
int L = m+ , R = m+ ;
Start += ;
//printf("###\n");
for( int i = ; i < * m ; i++ ){
if( a[i] < Start && Start < a[i+] ){
L = i , R = i + ;
break ;
}
}
//printf("( %d , %d ) , a[L] = %d , a[R] = %d \n",L,R,a[L],a[R]); //printf("%d , %d \n", L , R ) ;
int t1 = (Start-a[L]) >= M ? (Start-a[L]) - M : Start-a[L] ;
int t2 = (a[R]-Start) >= M ? (a[R]-Start) - M : a[R]-Start ;
//t1 = ( t1 + M ) % M ;
//t2 = ( t2 + M ) % M ;
//printf("%d\n",M);
//printf("%d %d\n",t1,t2) ;
//printf("%d %d\n",M - t1 , M - t2 );
int ans = min( (M - t1) , (M - t2) );
//printf("%d %d - %d = %d , %d - %d = %d \n",ans, Start , a[L] , (Start-a[L]) , a[R] , Start , (a[R]-Start) );
//printf("%d\n",ans);
for( int i = L ; L - m + < i ; i-- ){
ans = min( ans , (Start - a[i]) * + a[i+m-] - Start );
}
for( int i = R ; i < R + m - ; i++ ){
ans = min( ans , (a[i] - Start) * + Start - a[i-m+] );
}
ans = ans * ;
printf("%d.00\n",ans);
}
return ;
}
最新文章
- Information retrieval信息检索
- OpenGL图元的颜色属性
- centos7.2下编译安装git
- uva 10673 Play with Floor and Ceil
- 配置centos防火墙(iptables)开放80端口
- HDU 5821 Ball (排序)
- How to: Reading an ini config file from a batch file
- GWT事件处理
- excel poi 文件导出,支持多sheet、多列自动合并。
- navigationBar 背景色
- 多图片/文件上传 - SwfUpload/PlUpload
- WeMall微信商城源码插件会员卡代码详情
- ExtJs的Ext.Ajax.request实现waitMsg等待提示效果
- DXGI快速截屏录屏技术
- Jenkins - ERROR: Exception when publishing, exception message [Failure] Build step &#39;Send build artifacts over SSH&#39; changed build result to UNSTABLE
- Machine Learning 算法可视化实现1 - 线性回归
- ubuntu16.04中设置python3
- [skill][vim] 常用技巧与配置
- python3基础:基本语句(2017)
- node+koa中转层开发实践总结