链接:https://ac.nowcoder.com/acm/contest/20960/1034
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

ranko 的手表坏了,正常应该显示 xx:xx 的形式(4 个数字),比如下午 1 点半应该显示 13:30 ,但现在经常会有一些数字有概率无法显示。
ranko 在  t1t_1t1 时刻看了下时间,过了一段时间在 t2t_2t2 时刻看了下时间。她想知道, t1t_1t1t2t_2t2 这两个时刻之间相距的时间的最大值和最小值是多少?
保证 t1t_1t1t2t_2t2 之前(且 t1t_1t1t2t_2t2 不等)。t1t_1t1t2t_2t2在同一天的 00:00 到 23:59 之间。

输入描述:

两行输入两个时间,为 xx:xx 的形式。其中 xxx 为数字或者字符 '?' ,问号代表这个数字没有显示。
保证输入是合法的。

输出描述:

一行输出两个整数,分别代表 t1t_1t1t2t_2t2 相距时间的最小值和最大值(单位分钟)。
示例1

输入

18:0?
2?:1?

输出

121 319

说明

相距最小的时间为 18:09 到 20:10 ,相距121分钟。
相距最大的时间为 18:00 到 23:19 ,相距319分钟。
对一天内的分钟数进行枚举找出所有可能的分钟数进行双循环判断即可。
//根据一天内所有分钟进行枚举

#include <bits/stdc++.h>

using namespace std;
const int MAXN = 24*60;
int s1_minute[MAXN+10];
int s2_minute[MAXN+10];
int s1_n = 0;
int s2_n = 0;
int main() {
    int max_minute = 24*60;
    string s1,s2;
    cin>>s1>>s2;
    for (int i=0;i<MAXN;i++) {
        int hour = i/60;
        int minute = i%60;
        if ((s1[0]=='?'||s1[0]==(hour/10+'0'))&&(s1[1]=='?'||s1[1]==(hour%10+'0'))&&(s1[3]=='?'||s1[3]==(minute/10+'0'))&&(s1[4]=='?'||s1[4]==(minute%10+'0'))) {
            s1_minute[s1_n++] = i;
        }
        if ((s2[0]=='?'||s2[0]==(hour/10+'0'))&&(s2[1]=='?'||s2[1]==(hour%10+'0'))&&(s2[3]=='?'||s2[3]==(minute/10+'0'))&&(s2[4]=='?'||s2[4]==(minute%10+'0'))) {
            s2_minute[s2_n++] = i;
        }
    }
    int ans_max = INT_MIN;
    int ans_min = INT_MAX;
    for (int i=0;i<s1_n;i++) {
        for (int j=0;j<s2_n;j++) {
            if (s1_minute[i]<s2_minute[j]) {
                ans_max = max(ans_max, s2_minute[j] - s1_minute[i]);
                ans_min = min(ans_min, s2_minute[j] - s1_minute[i]);
            }
        }
    }
    cout<<ans_min<<" "<<ans_max<<endl;
    return 0;
}