1061 Dating (20 分)

wdnmd真就阅读理解啊,读了好几发并且rush了几发才算真正读懂题>_<。

题意

给出4个字符串,其中前两个字符串包含两个信息:DAY和HH,后两个包含一个信息:MM。
下面给出这个信息的识别信息和转换关系:

  1. DAY:前两个字符串的第一对相同位置的A ~ G的大写字母。
    • 转换关系:大写字母是从A开始的第几个,就是星期几。
  2. HH:寻找信息DAY的位置之后的第一对相同位置的0 ~ 9或A ~ N的字符。
    • 转换关系:0 ~ 9对应0 ~ 9,A ~ N对应10 ~ 23。
  3. MM:后两个字符串的第一对相同位置的A ~ Z或a ~ z的英文字母。
    • 转换关系:该字符所在的位置(从0开始)。

最后按DAY:HH:MM的格式输出。

思路

  1. 扫描前两个字符串,寻找第-对相同位置的A ~ G的大写字母。找到之后,求出其与字符'A'的距离,就可以推断出是星期几。
  2. 在步骤1的位置基础上,继续往后寻找,直到碰到第一对相同位置的 0 ~ 9或A ~ N的字符,将其分别转换到0 ~ 9与10 ~ 23。
  3. 扫描后两个字符串,寻找第一对相同位置的A ~ Z或a ~ z的英文字母,获取其位置。

注意点

  1. 步骤1和步骤2中不能出现A ~ Z,而是需要限定完整,即A ~ G或者A ~ N,否则会“答案错误”。
  2. 题目中“第2对相同的字符”这一描述有点模糊,其实是在第一个信息的位置之后的下一对满足条件的字符,而不是重新从头扫描碰到的第2对满足条件的字符。否则样例的理解会出现问题,即一开始的8也会被算进去,导致得到第2对满足条件的字符会是D而不是E。

(update)
这居然是个(20)分的题。。。。

string mp[]={"MON","TUE","WED","THU","FRI","SAT","SUN"};
string a,b,c,d;

bool check1(char x)
{
    return x>='A' && x<='G';
}

bool check2(char x)
{
    if(isdigit(x)) return true;
    else return x>='A' && x<='N';
}

int main()
{
    cin>>a>>b>>c>>d;

    int weekday;
    int hh,ss;
    int pos;
    for(int i=0;i<min(a.size(),b.size());i++)
        if(a[i] == b[i] && check1(a[i]) && check1(b[i]))
        {
            weekday=a[i]-'A';
            pos=i;
            break;
        }

    for(int i=pos+1;i<min(a.size(),b.size());i++)
        if(a[i] == b[i] && check2(a[i]) && check2(b[i]))
        {
            if(isdigit(a[i])) hh=a[i]-'0';
            else hh=a[i]-'A'+10;
            break;
        }

    for(int i=0;i<min(c.size(),d.size());i++)
        if(c[i] == d[i] && isalpha(c[i]))
        {
            ss=i;
            break;
        }

    printf("%s %02d:%02d",mp[weekday].c_str(),hh,ss);

   //system("pause");
    return 0;
}
原文地址:https://www.cnblogs.com/fxh0707/p/14399950.html