B. Planet Lapituletti
题目
题目大意
给你一个时间,然后让你找到往后的时间中在镜子中的合法时间(包括给你的起始时间),然后输出真实世界中的时间。
思路
显然3,4,6,7,7,9在镜子中的时间是不合法的,所以直接跳过往后面找,分钟和时钟,二者时间变化用两重循环满足其时间变化,而镜子成像满足映射关系,用一个map存储其中的映射关系,真是世界中是从左往右读数,镜子是从右往左,所以在判断时,对应的十位与个位要交换顺序,并判断是否超过了进制,如果都没有超过进制值输出已经找到的时间,如果在循环中都没有找到,那么表明时间到了h-1:m-1;那么下一分钟00:00 肯定满足题意,直接输出00:00。
输入样例
5
24 60
12:21
24 60
23:59
90 80
52:26
1 100
00:01//刚开始这个增加时间到00:10时间在镜子中呈像为01:00,为什么不对呢,因为h=1所以时位只能是1.
10 10
04:04
输出样例
12:21
00:00
52:28
00:00
00:00
通过代码
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define sl(n) scanf("%lld",&n)
#define pl(n) printf("%lld",n)
#define pE printf("\n")
#define ull unsigned long long
#define pb push_back
#define pre(n) for(ll i=1;i<=n;i++)
#define rep(n) for(ll i=n;i>=1;i--)
#define pi pair<ll,ll>
char a[7];
ll p[5]={3,4,6,7,9};
map<ll , ll>s;
int main(){
ll t,i,h,m,j;
sl(t);
s[0]=0,s[1]=1,s[2]=5,s[5]=2,s[8]=8;
while(t--){
sl(h),sl(m);
ll b,b1,b2,b3;
scanf("%s",a);
ll temp=(a[0]-'0')*10+a[1]-'0',temp1=(a[3]-'0')*10+a[4]-'0';
ll q=1;
for(i=temp;i<=h-1;i++){
bool flag1=false;
if(i==temp)j=temp1;
else j=0;
for(;j<=m-1;j++){
flag1=false;
b=i/10,b1=i%10,b2=j/10,b3=j%10;
for(ll k=0;k<5;k++){
if(b==p[k]||b1==p[k]||b2==p[k]||b3==p[k]){
flag1=true;
}
}
if(flag1)continue;
if(s[b1]*10+s[b]<=m-1&&s[b3]*10+s[b2]<=h-1){
cout<<b<<b1<<":"<<b2<<b3<<endl;
q=0;
break;
}
}
if(!q)break;
}
if(q)cout<<"00:00"<<endl;
}
return 0;
}