微软笔试Highway问题解析

本文介绍了一个模拟车辆在一条单向直行高速公路上行驶的算法。该算法考虑了车辆的速度限制、不能超车等条件,并计算出每辆车离开高速公路的时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
High way
 
时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

In the city, there is a one-way straight highway starts from the northern end, traverses the whole city southward, and finishes at the southern end. Due to some financial difficulties, there is only one lane on this highway, which means that overtaking other cars in front is impossible.

The highway is quite busy. Lots of different cars are running on it every day. For each car, it is running on the highway at the point which X km far from the northern end in Minute 0, and will leave at the point which Y km far from the northern end. Each car also has a speed limit L km/min. During the whole trip on the highway, each car should run as fast as possible without exceeding its speed limit or overtaking other cars in front. In addition, no two or more cars will be at the same point at Minute 0. Cars can be regarded as points and the distance between two cars can be infinitely small.

Given the information of N cars, please calculate the leaving time for each car.

输入

The first line contains one integer N. 2 <= N <= 1000.

Then follows N line. Each line contains three integers X, Y and L, showing the information of this car. 0 <= X < Y <= 1000000, 0 < L <= 10.

输出

Output N real numbers, one per line -- the leaving time (in minute) of each car, preserving the input order of cars. Your answers should be rounded to 2 digits after the decimal point and the output must contain exactly 2 digits after the decimal point.

样例输入
3
3 5 1
1 4 2
0 8 3
样例输出
2.00
1.50
3.00

代码:
package carRun;

import java.util.Scanner;

public class carTime {
	
	public static void main(String argv[]){
		
		Scanner br=new Scanner(System.in);
		car[] c;
		c=new car[100];              
		String[] k;
        k = new String[100];
        int num=0;
		 do { 
	            k[num] = br.nextLine(); 
	            if (k[num].equals("")) { 
	             break; 
	            } 
	            num++;    
	        } while(true); 
		
		 for(int i=0;i<num;i++){
	            
	            String[] sf=k[i].split(" ");	 
                c[i]=new car(Float.parseFloat(sf[0]),Float.parseFloat(sf[1]),Float.parseFloat(sf[2]));      //车初始化
                c[i].foreNumber=i+1;
                c[i].NforeNumber=i-1;
                
	 }
		
		   for(int i=0;i<num;i++){
	            
		        // System.out.println(c[i].start+" "+c[i].end+" "+c[i].catchspeed+" "+c[i].foreNumber+" "+c[i].NforeNumber);
	             
		 }	 
		 
		 float[] minTime;
		 minTime=new float[1000];
		 for(int i=0;i<1000;i++){
			 minTime[i]=1000;             //每段的最大时间 (初始化状态)
		 }
		 
		 int max; max=num-1; int min; min=0;int end=0;
		 
		
		for(int j=0;j>=0;j++){
		 
		 
		 int key; int mode; 
		 key=0; mode=0;
		 
		 // find the minTime
		 for(int i=min;i<max;){
			 if(c[i].catchspeed>c[c[i].foreNumber].catchspeed)
				 c[i].catchTime=(c[c[i].foreNumber].start-c[i].start)/(c[i].catchspeed-c[c[i].foreNumber].catchspeed);
			 c[i].downTime=(c[i].end-c[i].start)/c[i].catchspeed;
			 
			 if(c[i].catchTime!=0&&c[i].catchTime<=minTime[j])			 //0 present catch; 1 present down.
			 { minTime[j]=c[i].catchTime; key=i; mode=0;}
			 
			 if(c[i].downTime!=0&&c[i].downTime<=minTime[j])			 
			 {	 minTime[j]=c[i].downTime;key=i; mode=1;}
			 i=c[i].foreNumber;
		 }
	
		 c[max].downTime=(c[max].end-c[max].start)/c[max].catchspeed;
		 if(c[max].downTime!=0&&c[max].downTime<=minTime[j])
		 {	 minTime[j]=c[max].downTime;key=max; mode=1;}
		 
		
		 
		 if(mode==1)
			 c[key].downTag=j;
		 System.out.println("minTima["+j+"]:  "+minTime[j]+"  key:  "+key+"  mode:  "+mode+"              "+c[key].downTag);
		 // make the change of cars.
         for(int i=max;i>=min; ){
			 
        	 c[i].start=c[i].start+c[i].catchspeed*minTime[j];
        	 if(c[i].start==c[i].end)
        	    c[i].cardown=1;
        	 i=c[i].NforeNumber;
		 }
         
         //tab the head car number.
         for(int i=num-1;i>=0;i-- ){
        	 if(c[i].cardown==0)
        	 {  max=i;
        	    break;}
		 }
         //System.out.println("max:"+max);
         //tab the tail car number
         for(int i=0;i<=max;i++ ){
        	 if(c[i].cardown==0)
        	 {  min=i;
        	    break;}
		 }
        // System.out.println("min:"+min);
         
        
         //change the foreNumber
         for(int i=min;i<max;){
        	 
        	 for(int h=i+1;h<=max;h++ ){
        		 if(c[h].cardown==0)
        		 {
        			 
        			 c[i].foreNumber=h;
        			 c[h].NforeNumber=i;
        			// i=h;
        			 break;
        		 }
        	 }
        	 i=c[i].foreNumber;
        	
		 }
  
         //change the speed
     
         for(int i=c[max].NforeNumber;i>=0;){     
        	 
           // System.out.println(i+c[i].start+c[c[i].foreNumber].start+c[i].catchspeed+c[c[i].foreNumber].catchspeed+c[i].catchspeed+c[c[i].foreNumber].catchspeed);
          
        	if(c[i].start==c[c[i].foreNumber].start&&c[i].catchspeed>=c[c[i].foreNumber].catchspeed)
        		c[i].catchspeed=c[c[i].foreNumber].catchspeed;
        	if(c[i].start!=c[c[i].foreNumber].start)
        		c[i].catchspeed=c[i].speed;
        	i=c[i].NforeNumber;
		 }
         
         if(min==max)
         { c[min].catchspeed=c[min].speed;
           end++;
          }
         //test report
       /*  for(int i=0;i<num;i++){
	            
	         System.out.println(c[i].start+" "+c[i].end+" "+c[i].catchspeed+" "+c[i].foreNumber+" "+c[i].NforeNumber);
             
	 }*/
         
         //当只剩最后一辆车时,再循环一次,所有车便下了高速路。
		if(end==2)
			break;
		 
	}
		
		//Count the time.
		for(int i=0; i<num;i++){			
			int n=c[i].downTag;
			c[i].Sum=0;
			for(int y=0;y<=n;y++){
				c[i].Sum=c[i].Sum+minTime[y];
			}
			System.out.println("The "+i+"号车的下车时间: "+c[i].Sum);
		}

}

 

static class car{
	
	float start;                //记录起始位置
	float end;                  //记录目的地位置
	float speed;                //记录初始速度
	float catchspeed;           //记录每个时间段的真实速度
	float downTime;             //记录每个状态下距离下高速路的时间
	float catchTime;            //记录每个状态下距离追上前车的时间
	int   foreNumber;           //前面车的车号
	int   NforeNumber;          //后面车的车号
	int   cardown;              //记录车是否下路
	int  downTag;               //记录车在第几个时间段后下路
	float  Sum;                 //记录车下路要用的总时间
	public car(float a,float b, float c){
		this.start=a;
		this.end=b;
		this.speed=c;
		this.catchspeed=c;
		this.downTime=0;
		this.catchTime=0;
		this.foreNumber=0;
		this.cardown=0;
		this.NforeNumber=0;
		this.downTag=0;
		this.Sum=0;
	}
}

}

 

运行效果:

 

输入按照起始位置输入,省去了对原数据的排序。

转载于:https://www.cnblogs.com/udld/p/4184123.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值