CF1493B Planet Lapituletti 题解

发布于 2021-03-08  376 次阅读


题目链接

题意

星球的一天有 $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;
}

月流华 岁遗沙 万古吴钩出玉匣