1 条题解

  • 0
    @ 2025-5-6 20:04:45

    解题思路

    1. 输入处理
      • 持续读取道路数量 n,直到 n-1 时结束输入。
      • 对于每个道路,读取其距离 dis[i]、绿灯时长 g[i]、黄灯时长 y[i] 和红灯时长 r[i],并计算出一个周期的总时长 p[i] = g[i] + y[i] + r[i]
    2. 速度测试函数 test
      • test 函数接收一个速度 sped 作为参数。
      • 对于每条道路,计算以该速度通过该道路所需的时间 t = dis[i] * 1.0 * 3600 / sped(将距离转换为米,时间单位转换为秒)。
      • 计算通过该道路的时间 t 包含的周期数 times = (int)(t) / p[i]
      • 检查剩余时间 t - times * p[i] 是否大于绿灯和黄灯时长之和 g[i] + y[i],若大于则说明会遇到红灯,返回 false;若所有道路都不遇到红灯,则返回 true
    3. 寻找可接受速度
      • 在速度范围 30 到 60 之间遍历每个速度 sped,调用 test 函数判断该速度是否可接受。如果可接受,则将 canbe[sped] 标记为 true
    4. 输出可接受速度范围
      • 遍历速度范围 30 到 60,根据 canbe 数组的标记情况确定可接受速度的连续范围。
      • 当遇到第一个可接受速度时记录起始速度 st,当遇到不可接受速度时记录结束速度 ed 并输出该速度范围(格式为 st - ed 或单个速度 st)。
      • 如果最后一个速度是可接受的,也需要记录并输出其对应的速度范围。
      • 如果没有可接受的速度,则输出 "No acceptable speeds."
    #include<iostream>
    #include<cstring>
    using namespace std;
    
    long double dis[6];
    int n,g[6],y[6],r[6],p[6];
    
    bool canbe[61];
    
    bool test(int sped){
    	for(int i = 0; i < n; i++){
    		long double t = dis[i]*1.0*3600/sped;
    		int times = (int)(t)/p[i];
    		if(t-times*p[i]>g[i]+y[i])
    			return 0;
    	}
    	return 1;
    }
    
    
    int main(){
    	int nc = 1;
    	while(cin>>n&&n!=-1){
    		memset(canbe,0,sizeof(canbe));
    		for(int i = 0; i < n; i++){
    			cin >> dis[i] >> g[i] >> y[i] >> r[i];
    			p[i] = g[i]+y[i]+r[i];
    		}
    		
    		for(int sped = 30; sped <= 60; sped++)
    			if(test(sped))
    				canbe[sped] = 1;
    		cout << "Case " << nc++ << ": ";
    		bool init = 1,in = 0;
    		int st,ed,valid=0;
    		for(int i = 30; i <= 60; i++)
    			if(canbe[i]){
    			valid++;
    			if(in==0)
    				st = i, in = 1;
    		}
    		else{
    			if(in==1){
    				ed = i-1, in = 0;
    				if(init==0) cout << ", ";
    				init = 0;
    				if(ed-st>0)
    					cout << st << "-" << ed;
    				else
    					cout << st;
    			}
    		}
    		if(in){
    			valid++;
    			ed = 60;
    			if(init==0) cout << ", ";
    			if(ed-st>0)
    				cout <<st << "-" << ed;
    			else cout<< st;
    		}
    		if(valid==0)
    			cout <<"No acceptable speeds.";
    		cout << endl;
    	}
    }
    
    
    • 1

    信息

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