文章目录
题意
星球的一天有 $h$ 小时,每小时有 $m$ 分钟。现在给定一个当前时间,询问最近的在镜中对称之后合法的时间。
解析
主要是注意一些细节。首先判断最近的对称过去合法的小时,如果给出的时间的小时本身对称过去就是合法的,那么分钟就要从给出的分钟开始找,一直找到第一个合法的。否则,如果小时与给定的不一致,分钟就一定为 $0$,即输出一定为 XX:00
。特别的,如果开始的小时就合法,分钟又找到结尾都找不到,那么分钟就只能取 $0$,这时我们发现原先确定的小时配上分钟就不合法了,因此需要将小时加一之后再重新找一次,同样的,找不到取 $0$ 即可。
代码中会写一些注释,帮助理解。
代码
#include<bits/stdc++.h>
using namespace std;
int t,H,M,h,m;
int ansh,ansm;
int RRef[10]={0,1,5,-1,-1,2,-1,-1,8,-1};
int main(){
scanf("%d",&t);
while(t--){
scanf("%d%d",&H,&M);
scanf("%d:%d",&h,&m);
ansh=ansm=-1;
for(int i=h;i<H;i++){
int a=i/10,b=i%10,now;
if(RRef[a]==-1||RRef[b]==-1) continue;
now=RRef[b]*10+RRef[a];
if(now<M){//注意对称过去之后小时和分钟两者位置对调
ansh=i;break;
}
}//先找最近的合法小时
if(ansh!=h) m=0;//如果小时变了,分钟取 0 即可
for(int i=m;i<M;i++){
int a=i/10,b=i%10,now;
if(RRef[a]==-1||RRef[b]==-1) continue;
now=RRef[b]*10+RRef[a];
if(now<H){
ansm=i;break;
}
}
if(ansm==-1){//分钟找不到,就隐含了给定的小时合法的条件
h++;ansh=-1;//此时原小时不合法,必须加 1
for(int i=h;i<H;i++){
int a=i/10,b=i%10,now;
if(RRef[a]==-1||RRef[b]==-1) continue;
now=RRef[b]*10+RRef[a];
if(now<M){
ansh=i;break;
}
}
}
if(ansh<=0) printf("00");
else if(ansh<10) printf("0%d",ansh);
else printf("%d",ansh);
printf(":");
if(ansm<=0) printf("00");
else if(ansm<10) printf("0%d",ansm);
else printf("%d",ansm);
printf("\n");//输出
}
return 0;
}
叨叨几句... NOTHING