1061 Dating (20 分)
wdnmd真就阅读理解啊,读了好几发并且rush了几发才算真正读懂题>_<。
题意
给出4个字符串,其中前两个字符串包含两个信息:DAY和HH,后两个包含一个信息:MM。
下面给出这个信息的识别信息和转换关系:
- DAY:前两个字符串的第一对相同位置的A ~ G的大写字母。
- 转换关系:大写字母是从A开始的第几个,就是星期几。
- HH:寻找信息DAY的位置之后的第一对相同位置的0 ~ 9或A ~ N的字符。
- 转换关系:0 ~ 9对应0 ~ 9,A ~ N对应10 ~ 23。
- MM:后两个字符串的第一对相同位置的A ~ Z或a ~ z的英文字母。
- 转换关系:该字符所在的位置(从0开始)。
最后按DAY:HH:MM的格式输出。
思路
- 扫描前两个字符串,寻找第-对相同位置的A ~ G的大写字母。找到之后,求出其与字符'A'的距离,就可以推断出是星期几。
- 在步骤1的位置基础上,继续往后寻找,直到碰到第一对相同位置的 0 ~ 9或A ~ N的字符,将其分别转换到0 ~ 9与10 ~ 23。
- 扫描后两个字符串,寻找第一对相同位置的A ~ Z或a ~ z的英文字母,获取其位置。
注意点
- 步骤1和步骤2中不能出现A ~ Z,而是需要限定完整,即A ~ G或者A ~ N,否则会“答案错误”。
- 题目中“第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;
}