1.题目
2.代码
#include <iostream>
#include <string>
using namespace std;
int main(){
int N;
cin>>N;
string people[N], login[N], logout[N];
long loginNum[N], logoutNum[N];
for(int i=0;i<N;i++){
cin>>people[i]>>login[i]>>logout[i];
loginNum[i] = ((login[i][0]-'0')*10 + (login[i][1]-'0')) * 3600 + ((login[i][3]-'0')*10 + (login[i][4]-'0')) * 60 + ((login[i][6]-'0')*10 + (login[i][7]-'0'));
logoutNum[i] = ((logout[i][0]-'0')*10 + (logout[i][1]-'0')) * 3600 + ((logout[i][3]-'0')*10 + (logout[i][4]-'0')) * 60 + ((logout[i][6]-'0')*10 + (logout[i][7]-'0'));
}
long minLogin, maxLogout;
int minIndex, maxIndex;
minLogin = loginNum[0];
maxLogout = logoutNum[0];
minIndex = 0;
maxIndex = 0;
for(int i=1;i<N;i++){
if(minLogin > loginNum[i]){
minLogin = loginNum[i];
minIndex = i;
}
}
for(int i=1;i<N;i++){
if(maxLogout < logoutNum[i]){
maxLogout = logoutNum[i];
maxIndex = i;
}
}
//cout<<"minLogin:"<<minLogin<<"minIndex:"<<minIndex<<endl;
//cout<<"maxLogout:"<<maxLogout<<" maxIndex:"<<maxIndex<<endl;
cout<<people[minIndex]<<" "<<people[maxIndex];
}
3.解题思路
这里要求输出最早签到打卡的同学和最晚签出打卡的同学,我们可以通过比较同学签到和签出打卡的时间来确定答案。
在这里用的是通过字符串的读取把字符串表示的时间形式全部转换为秒的形式存储到数组中,再进行最大最小值的循环比较的形式。
4.改进思路
在字符串中,如果直接使用操作符进行比较:
逐个比较两个串中对应的字符,字符大小按照ASCII码值确定,从左向右比较,如果遇到不同字符,所遇第一对不同字符的大小关系就确定了两个字符串的大小关系,如果未遇到不同字符而某个字符串首先结束,那么这个字符串是较小的,否则两个字符串相等。
而ASCII码的比较在本题中也对应了时间的比较,因此为了简化流程,我们可以直接使用操作符进行比较,就省去了手动转换成数值形式的繁琐步骤。