- 答疑:
解题遇到问题?分享解题心得?讨论本题请访问:http://t.jobdu.com/thread-7737-1-1.html
思路:还是比较简单的吧,把第一个人的编号当做开门和关门的,以后读取每个人,然后都和之前的进行比较即可。
#include <iostream>#include <string>#include <fstream>using namespace std;struct Time{string str;//证件号码 int time[6];//表示时间的 };int main(){Time open,close;ifstream in;in.open("1.txt");int n,m;in>>n;while(n--){in>>m;string str1,str2;int count=0;in>>open.str;close.str=open.str;//把第一个人默认为开门和关门的人 in>>str1;//记录第一个人的开门时间 for(int i=0;i<str1.length();i++){if(str1[i]!=':'){open.time[count]=str1[i]-'0';++count;}}count=0;in>>str2;//记录第一个人的关门时间 for(int i=0;i<str2.length();i++){if(str2[i]!=':'){close.time[count]=str2[i]-'0';++count;}}for(int i=1;i<m;i++)//开始循环判断时间的大小,来确定开门和关门的编号 {string str,str1,str2;int count=0;int temp[6];in>>str;//输入证件号 in>>str1;//比较开门的时间 for(int i=0;i<str1.length();i++){if(str1[i]!=':'){temp[count]=str1[i]-'0';++count;}}for(int i=0;i<6;i++){if(temp[i]<open.time[i]){open.str=str;for(int j=0;j<6;j++)open.time[j]=temp[j];break;}else if(temp[i]>open.time[i])break;}count=0;in>>str2;//比较关门的时间 for(int i=0;i<str2.length();i++){if(str2[i]!=':'){temp[count]=str2[i]-'0';++count;}}for(int i=0;i<6;i++){if(temp[i]>close.time[i]){close.str=str;for(int j=0;j<6;j++)close.time[j]=temp[j];break;}else if(temp[i]<close.time[i])break;}}cout<<open.str<<" "<<close.str<<endl;}return 0;}
(2)看了一下别人的,竟然还是用字符串比较,的确很方便。
#include <iostream> #include <stdio.h> #include <string.h> #include <string> #include <algorithm> using namespace std; const int maxn = 10002; struct Task{ char name[16]; char start[12]; char end[12]; }tasks[maxn]; Task minTask; Task maxTask; int n,m,i,j; int main(){ char start[12]; char end[12]; char name[16]; cin >> n; for(i = 0; i < n ; i++){ cin >> m; cin >> minTask.name; cin >> minTask.start; cin >> minTask.end; strcpy(maxTask.name,minTask.name); strcpy(maxTask.start,minTask.start); strcpy(maxTask.end,minTask.end); for(j = 1; j < m ; j++){ cin >> name; cin >> start; cin >> end; if(strcmp(start,minTask.start) < 0){ strcpy(minTask.name,name); strcpy(minTask.start,start); strcpy(minTask.end,end); } if(strcmp(end,minTask.end) > 0){ strcpy(maxTask.name,name); strcpy(maxTask.start,start); strcpy(maxTask.end,end); } } cout<<minTask.name<<' '<<maxTask.name<<endl; } return 0; }
(3)还有更神奇的字符串比较函数compare()的使用,新技能get.
#include<iostream> #include<string> using namespace std; int main() { int n; cin>>n; for(int j=0;j<n;j++) { int count=0; cin>>count; string str[10000][3]={""}; int min=0,max=0; cin>>str[0][0]>>str[0][1]>>str[0][2]; for(int i=1;i<count;i++) { cin>>str[i][0]>>str[i][1]>>str[i][2]; if(str[i][1].compare(str[min][1])<0)min=i; if(str[i][2].compare(str[max][2])>0)max=i; } cout<<str[min][0]<<' '<<str[max][0]<<endl; } return 0; }
compare函数用来进行字符串以及其子串的比较,示例如下:
#include <iostream> #include <string> #include <cctype> using std::cout; using std::endl; using std::cin; using std::string; int main(void){ string str1="hi,test,hello"; string str2="hi,test"; //字符串比较 if(str1.compare(str2)>0) printf("str1>str2\n"); else if(str1.compare(str2)<0) printf("str1<str2\n"); else printf("str1==str2\n"); //str1的子串(从索引3开始,包含4个字符)与str2进行比较 if(str1.compare(3,4,str2)==0) printf("str1的指定子串等于str2\n"); else printf("str1的指定子串不等于str2\n"); //str1指定子串与str2的指定子串进行比较 if(str1.compare(3,4,str2,3,4)==0) printf("str1的指定子串等于str2的指定子串\n"); else printf("str1的指定子串不等于str2的指定子串\n"); //str1指定子串与字符串的前n个字符进行比较 if(str1.compare(0,2,"hi,hello",2)==0) printf("str1的指定子串等于指定字符串的前2个字符组成的子串\n"); else printf("str1的指定子串不等于指定字符串的前2个字符组成的子串\n"); return 0; }