Ferry Loading III

来源:互联网 发布:大学生手机号码数据库 编辑:程序博客网 时间:2024/05/23 01:58

Ferry Loading III

import java.util.*;
import java.io.*;
class Car
{
 String position;
//左岸?右岸?
 int t;//汽车到达的时间
 int p;//记录读入输入文件时的顺序
 public Car(int t,String s,int p)
 
{
  
this.position=s;
  
this.t=t;
  
this.p=p;
 }
 
}

class sequence
{
 
int number;//记录存放顺序,以便在对应位置输出结果
 int time;//到达对岸所花时间
 public sequence(int number,int time)
 
{
  
this.number=number;
  
this.time=time;
 }

}

class Test4 
{
 
public static void main(String[] args) throws Exception
 
{
  BufferedReader bf
=new BufferedReader(new FileReader("ferry.in"));
  
int num=Integer.parseInt(bf.readLine());
  String str;
  StringTokenizer tag;
  
for(int i=0;i<num;i++)
  
{
   str
=bf.readLine();
   tag
=new StringTokenizer(str);
   
int n=Integer.parseInt(tag.nextToken());
   
int t=Integer.parseInt(tag.nextToken());
   
int m=Integer.parseInt(tag.nextToken());
   Car car[]
=new Car[m];
   
for(int j=0;j<m;j++)
   
{
    str
=bf.readLine();
    tag
=new StringTokenizer(str);
    car[j]
=new Car(Integer.parseInt(tag.nextToken()),tag.nextToken(),j);
   }

   Car tmp;
   
for(int j=0;j<car.length-1;j++)
    
for(int k=j+1;k<car.length;k++)
    
if(car[j].t>car[k].t)
    
{
    tmp
=car[j];
    car[j]
=car[k];
    car[k]
=tmp;
    }
   
   Vector v1
=new Vector(); //存放每辆汽车到达的时间
   Vector v2=new Vector(); //存放每辆汽车到达对岸的时间
   Vector v3=new Vector(); //记录可过河的汽车数
   int totaltime=car[0].t; //初始化为船第一次过河等待的时间
   for(int j=0;j<car.length;j++)
   v1.add(car[j]);
   
int k;
   
int total=0
   
boolean loop1;
   
boolean loop2;
   
while(total!=m)//汽车没有全部到达对岸,total为已经到达对岸的汽车的数量
   {
    
do{
    k
=0;//at left
    boolean flag=true;
    loop1
=true;
       
for(int j=0;j<v1.size();j++)//扫描左岸可过河的汽车
     if(((Car)v1.elementAt(j)).position.equals("left")&&((Car)v1.elementAt(j)).t<=totaltime)
     
{
      v3.add(j);
      k
++;
      
if(k==n)break;
     }
        
    
for(int j=0;j<v3.size();j++)
    
{
     
if(flag==true){totaltime+=t;flag=false;}//保证totaltime变量只加一次过河的时间t
     v2.add(new sequence(((Car)v1.elementAt(((Integer)v3.elementAt(j)).intValue())).p,totaltime));
     total
++;
     v1.removeElementAt(((Integer)v3.elementAt(j)).intValue());
     v1.insertElementAt(
new Car(Integer.MAX_VALUE,"left",0),((Integer)v3.elementAt(j)).intValue());
    }

    
int len=v3.size();v3.removeAllElements();
    
if(len>0){loop1=false;}
    
else if(len==0&&right(totaltime,v1))
     
{
     totaltime
+=t;
     loop1
=false;     
     }

    
else 
    
{
     
if(getP(totaltime=getmin(v1),v1).equals("right"))
     
{totaltime+=t;loop1=false;}          
    }

    }
while(loop1==true);
    
    
do{
    k
=0;//at right 
    boolean flag=true
    loop2
=true;
       
for(int j=0;j<v1.size();j++)//扫描右岸可过河的汽车
     if(((Car)v1.elementAt(j)).position.equals("right")&&((Car)v1.elementAt(j)).t<=totaltime)
     
{
      v3.add(j);      
      k
++;
      
if(k==n)break;
     }
 
    
for(int j=0;j<v3.size();j++)
    
{
     
if(flag==true){totaltime+=t;flag=false;}//保证totaltime变量只加一次过河的时间t
     v2.add(new sequence(((Car)v1.elementAt(((Integer)v3.elementAt(j)).intValue())).p,totaltime));
     total
++;
     v1.removeElementAt(((Integer)v3.elementAt(j)).intValue());
     v1.insertElementAt(
new Car(Integer.MAX_VALUE,"left",0),((Integer)v3.elementAt(j)).intValue());
    }

    
int len=v3.size();v3.removeAllElements();
    
    
if(len>0){loop2=false;}
    
else if(len==0&&left(totaltime,v1))
     
{totaltime+=t;loop2=false;}
    
else 
    
{
     
if(getP(totaltime=getmin(v1),v1).equals("left"))
     
{totaltime+=t;
     loop2
=false;}
 
    }

    }
while(loop2==true);
   }

   sequence s[]
=new sequence[v2.size()];
   
for(int j=0;j<v2.size();j++)
   s[j]
=(sequence)v2.elementAt(j);    
   Arrays.sort(s,
new Comparator(){
    
public int compare(Object a,Object b)
    
{
     sequence s1
=(sequence)a;
     sequence s2
=(sequence)b;
     
return s1.number-s2.number;
    }
}
);
    
for(int j=0;j<s.length;j++)
         System.out.println(s[j].time);
     }

    }

 
public static boolean left(int totaltime,Vector v1)//左岸是否有汽车能过河
 {
  
for(int j=0;j<v1.size();j++)//扫描左岸可过河的汽车
   if(((Car)v1.elementAt(j)).position.equals("left")&&((Car)v1.elementAt(j)).t<=totaltime)
    
return true;
   
return false;
 }

 
public static boolean right(int totaltime,Vector v1)//右岸是否有汽车能过河
 {
  
for(int j=0;j<v1.size();j++)//扫描右岸可过河的汽车
   if(((Car)v1.elementAt(j)).position.equals("right")&&((Car)v1.elementAt(j)).t<=totaltime)
    
return true;
   
return false;
 }

 
public static int getmin(Vector v1)//获取能够过河的汽车到达时间的最小值
 {
  
int tmp=((Car)v1.elementAt(0)).t;
  
for(int i=1;i<v1.size();i++)
   
if(tmp>((Car)v1.elementAt(i)).t)
   tmp
=((Car)v1.elementAt(i)).t;  
  
return tmp;
 }

 
public static String getP(int value,Vector v1)//左岸?右岸?
 {
  
for(int i=0;i<v1.size();i++)
   
if(value==((Car)v1.elementAt(i)).t)
   
return ((Car)v1.elementAt(i)).position;
  
return null;
 }

}

试题四:

Input:ferry.in output:ferry.out

    在桥变得普遍之前,一般是用渡船来渡汽车过河。河里的渡船,不象那些大渡船,是沿缆绳摆渡的。

    有一艘可装n辆汽车的渡船来回各需t分钟。到达河岸的汽车都可由渡船渡 到对岸。只要装载了一辆汽车或对岸至少有一辆汽车在等渡,则渡船则连续来回地在两岸之间摆渡。只要渡船一靠岸,它就马上让汽车下渡,并装载在岸边等待的至多n辆汽车。假如多于n辆,那么就优先装载等待时间最长的汽车。如果两岸者没有汽车等待过渡,那么渡船就等待直到有一辆汽车到达,让它上船(如果在渡船的同岸),并过河。每辆汽车在什么时刻到达对岸?

输入

    输入的第一行是测试用例个数c。每个测试用例第一行是三个数:n,t,m,其中n,t,m的意义如上所述(n表示一趟可装的汽车数,t表示渡船从岸边到对岸的分钟数,m表示到达岸边的汽车数)。随后的m行,每行表示一辆汽车到达的时间(自该天开始的分钟数),以及汽车所在河岸(”left””right”)。对每个测试用例,每辆汽车输出一行,顺序与输入顺序相同,给出每辆汽车在对岸下船的时间。两个测试用例之间输出一空行。

    可假设0 < n, t, m ≤ 10000。每个测试的到达时间严格递增。渡船开始在河的left岸。汽车上船与下船时间可认为是0.

Sample input

2

2 10 10

0 left

10 left

20 left

30 left

40 left

50 left

60 left

70 left

80 left

90 left

2 10 3

10 right

25 left

40 left

Output for sample

10

30

30

50

50

70

70

90

90

110

 

30

40

60

原创粉丝点击