1 条题解

  • 0
    @ 2025-5-6 12:09:04

    本题是多组数据输入的公交搭乘等待时间计算问题,解题思路如下:

    1. 数据输入:不断读取输入,直至遇到 "ENDOFINPUT"。先获取线路数量 n,再逐行读取每条线路各时间段时长,算出各线路总周期时长。最后获取起始时间 start
    2. 等待时间计算:对每条线路,用 start 对总周期时长取余得剩余时间 rest,找出 rest 所在时间段。若 rest 为 0 则等待时间为 0;否则计算该时间段剩余时间,取所有线路中最短等待时间。
    3. 结果输出:输出最早能搭乘的最短等待时间。
    #include<iostream>
    #include<sstream>
    #include<cstring>
    #include<string>
    using namespace std;
    
    int n,m,timetable[25][15],route[25],sum[25],start;
    
    int atoi(string s){
    	int res;
    	stringstream ss;
    	ss<<s;
    	ss>>res;
    	return res;
    }
    
    int main(){
    	string s;
    	while(getline(cin,s)&&s!="ENDOFINPUT"){
    		string temp;
    		for(int i = 0; i < s.size(); i++)
    			if(s[i]<='9'&&s[i]>='0')
    				temp.push_back(s[i]);
    		n = atoi(temp);
    		memset(route,0,sizeof(route));
    		memset(sum,0,sizeof(sum));
    		for(int i = 0; i < n; i++){
    			getline(cin,s);
    			string temp;
    			for(int j = 0; j < s.size(); j++)
    				if(s[j]==' '&&temp.size()>0)
    					timetable[i][route[i]++] = atoi(temp), temp.clear();
    			else if(s[j]!=' ')
    				temp.push_back(s[j]);
    			if(temp.size()>0)
    				timetable[i][route[i]++] = atoi(temp);
    			for(int j = 0; j < route[i]; j++)
    				sum[i]+=timetable[i][j];
    		}
    		getline(cin,s);
    		temp.clear();
    		for(int i = 0; i < s.size(); i++)
    			if(s[i]<='9'&&s[i]>='0')
    				temp.push_back(s[i]);
    		start = atoi(temp);
    		int res = 100000000;
    		for(int i = 0; i < n; i++){
    			int rest = start;
    			rest = rest%sum[i];
    			int j = 0;
    			while(rest>timetable[i][j]){
    				rest-=timetable[i][j];
    				j++;
    			}
    			if(rest==0){
    				res = 0;
    				break;
    			}
    			else
    				res = min(res,timetable[i][j]-rest);
    		}
    		cout << res << endl;
    		getline(cin,s);
    	}
    }
    
    
    
    • 1

    信息

    ID
    305
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者