随笔- 19  评论- 0  文章- 0 

PAT1006

这道题对我来说还是有些难度的,难度在于我对字符串处理的方法不熟悉,字符串的识别,切割,截取

在这道题里面我是使用string的find(要查找的字符,起始位置)substr(起始位置,切割长度)方法,个人记法,切割长度就是要截下来的串的末尾位置-起始位置+1

同时,在获取输入时候使用cin.get(c)来搞掉换行符(或者其他你不想要的符号)

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;


int min_compare(vector<string> &in){
	vector<int> candidate;
	vector<int> time;
	for(int i=0;i!=in.size();++i){
		candidate.push_back(i);
	}
	while(true){
		time.clear();
		for(int i=0;i!=candidate.size();++i){
			int number=candidate[i];
			int posi=in[number].find(':',0);
			if(posi!=-1){
				string t=in[number].substr(0,posi);
				time.push_back((t[0]-'0')*10+(t[1]-'0'));
				in[number]=in[number].substr(posi+1,in[number].size()-posi-1);
			}
			else{
				string t=in[number].substr(0,in[number].size());
				time.push_back((t[0]-'0')*10+(t[1]-'0'));
			}
		}
		int min_time=*min_element(time.begin(),time.end());
		int count=0;
		for(int i=0;i!=time.size();++i){
			if(time[i]==min_time){
				candidate[count]=candidate[i];
				++count;
			}
		}
		if(count==1)
			return candidate[0];
	}
}

int max_compare(vector<string> &out){
	vector<int> candidate;
	vector<int> time;
	for(int i=0;i!=out.size();++i){
		candidate.push_back(i);
	}
	while(true){
		time.clear();
		for(int i=0;i!=candidate.size();++i){
			int number=candidate[i];
			int posi=out[number].find(':',0);
			if(posi!=-1){
				string t=out[number].substr(0,posi);
				time.push_back((t[0]-'0')*10+(t[1]-'0'));
				out[number]=out[number].substr(posi+1,out[number].size()-posi-1);
			}
			else{
				string t=out[number].substr(0,out[number].size());
				time.push_back((t[0]-'0')*10+(t[1]-'0'));
			}
		}
		int max_time=*max_element(time.begin(),time.end());
		int count=0;
		for(int i=0;i!=time.size();++i){
			if(time[i]==max_time){
				candidate[count]=candidate[i];
				++count;
			}
		}
		if(count==1)
			return candidate[0];
	}
}


int main(){
	vector<string> id;
	vector<string> in;
	vector<string> out;
	int num;
	cin>>num;
	//discard the line break
	char c;
	cin.get(c);
	for(int i=0;i!=num;i++){
		string line;
		getline(cin,line);
		string::size_type posi1=line.find(" ",0);
		id.push_back(line.substr(0,posi1));
		string::size_type posi2=line.find(" ",posi1+1);
		in.push_back(line.substr(posi1+1,posi2-posi1-1));
		out.push_back(line.substr(posi2+1,line.size()-posi2-1));	
	}
	int sign_in=min_compare(in);
	int sign_out=max_compare(out);
	cout<<id[sign_in]<<" "<<id[sign_out];
	
	return 0;
}

 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

/*
  自己做完PAT1006之后看网上其他人的做法,别人30行搞定,自己居然用了100行,不明觉菜 
  学习了别人的做法后决定再重写一遍
  之前总是习惯使用string来处理字符串操作,现在使用char数组做一下,熟悉一下原生字符数组的一些基本操作 
*/
#include<iostream>
#include<cstring>
using namespace std;

int main(){
    int num;
    cin>>num;
    char max_time[10]="00:00:00";
    char min_time[10]="23:59:59";
    char max_id[30]="";
    char min_id[30]="";
    char id[30],in[10],out[10];
    while(num--){
        cin>>id>>in>>out;
        if(strcmp(min_time,in)>0){
            strcpy(min_time,in);
            strcpy(min_id,id);
        }
        if(strcmp(out,max_time)>0){
            strcpy(max_time,out);
            strcpy(max_id,id);
        }
    }
    cout<<min_id<<" "<<max_id;
    
    return 0;
}

 

posted on 2019-08-28 15:57 川川——叮叮咚咚 阅读(...) 评论(...) 编辑 收藏