从小明家所在公交站出发有n路公交到公司,现给出每路公交的停站数(不包括起点和终点),及每次停的时间(一路车在每个站停的时间相同)和发车的间隔,先假定每辆车同时在相对时间0分开始发车,且所有车在相邻两个站之间的耗时相同,都为5分钟。给定小明起床的相对时间(相对0的分钟数),请计算他最早到达公司的相对时间。
给定每路车的停站数stops,停站时间period,发车间隔interval及公交路数n,出发时间s。请返回最早到达时间。保证公交路数小于等于500,停站数小于等于50。
从小明家所在公交站出发有n路公交到公司,现给出每路公交的停站数(不包括起点和终点),及每次停的时间(一路车在每个站停的时间相同)和发车的间隔,先假定每辆车同时在相对时间0分开始发车,且所有车在相邻两个站之间的耗时相同,都为5分钟。给定小明起床的相对时间(相对0的分钟数),请计算他最早到达公司的相对时间。
给定每路车的停站数stops,停站时间period,发车间隔interval及公交路数n,出发时间s。请返回最早到达时间。保证公交路数小于等于500,停站数小于等于50。
//精简版 class TakeBuses { public: int chooseLine(vector<int> stops, vector<int> period, vector<int> interval, int n, int s) { int firsttime = INT32_MAX; for(int i=0;i<n;i++){ int sd,total; (s%interval[i] == 0)?(sd = s):(sd = interval[i]*(s/interval[i] + 1) ); total = sd + stops[i] * (5 + period[i]); if(total<firsttime) firsttime = total; } return firsttime+5; } }; // class TakeBuses { public: int chooseLine(vector<int> stops, vector<int> period, vector<int> interval, int n, int s) { int firsttime = 100000000; for(int i=0;i<n;i++){ int sc; (s%interval[i]==0)?(sc = s):(sc = (s/interval[i]+1)*interval[i]); int tc = period[i]*stops[i]; int xc = (stops[i]+1)*5; int total = sc + tc + xc; if(total<firsttime) firsttime = total; } return firsttime; } };
import java.util.*; public class TakeBuses { public int chooseLine(int[] stops, int[] period, int[] interval, int n, int s) { // write code here int minCost = Integer.MAX_VALUE; // 计算每路公交的最早到达时间,取其中最小的 for(int i = 0; i < n; i++){ int waitTime = s % interval[i] == 0? 0: interval[i] - s % interval[i]; // 等车时间 minCost = Math.min(minCost, waitTime + (stops[i] + 1)*5 + stops[i]*period[i]); } return minCost + s; } }
还是挺简单的题,可以进一步优化, 即保存每辆车的坐车时间,不必每次都要去算公共项,你可以试试,我的代码没有实现
package com.special.first;
import java.util.Scanner;
/**
* 去哪儿网02-乘公交车
*
* 一开始以为要换乘等等,动态规划吗?
* 后来发现原来坐一辆车就直接到了,所以我们重点判断每辆车到公司的时间即可
*
* 到公司的总时间:起床时间 + 等车时间 + 坐车时间(运行时间 + 停车时间)
*
* 等车时间为 :
* 1.若起床时间正好等于发车间隔的整数倍,说明可以直接上车,等车时间为0
* 2.若起床时间与发车间隔的取余m不为0,说明与上一辆错过了m时间
* 同时下一辆距离发车时间为发车间隔 - m
*
* 坐车时间:
* RUN_TIME * (stops[i] + 1) + period[i] * stops[i]);
*
* Create by Special on 2018/3/3 11:37
*/
public class Pro033 {
static final int RUN_TIME = 5;
public static int chooseLine(int[] stops, int[] period, int[] interval, int n, int s) {
int time = Integer.MAX_VALUE, missTime;
for(int i = 0; i < n; i++){
missTime = s % interval[i];
time = Math.min(time,
(missTime == 0 ? 0 : interval[i] - missTime)
+ RUN_TIME * (stops[i] + 1)
+ period[i] * stops[i]);
}
return time + s;
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
while(input.hasNext()){
int n = input.nextInt();
int s = input.nextInt();
int[] stops = new int[n];
int[] period = new int[n];
int[] interval = new int[n];
for(int i = 0; i < n; i++){
stops[i] = input.nextInt();
period[i] = input.nextInt();
interval[i] = input.nextInt();
}
System.out.println(chooseLine(stops, period, interval, n, s));
}
}
}
class TakeBuses { public: int chooseLine(vector<int> stops, vector<int> period, vector<int> interval, int n, int s) { int Min = INT_MAX; for(int i=0;i<n;i++) { int m = s%interval[i]; int w; if(m==0) w = 0; else w = interval[i] - m; Min = min(Min, w+(stops[i]+1)*5 + stops[i]*period[i]); } return Min + s; } };
class TakeBuses {
public:
int chooseLine(vector<int> stops, vector<int> period, vector<int> interval, int n, int s) {
int sum,sum1,min;
min=(stops[0]+1)*5+period[0]*stops[0]+s+interval[0];
for(int i=0;i<n;i++)
{
sum1=(stops[i]+1)*5+period[i]*stops[i]+s;
if(s%interval[i]==0)
sum=sum1;
else
sum=sum1+interval[i]-s%interval[i];
if(sum<min)
min=sum;
} return min; }
};
class TakeBuses { public: int chooseLine(vector<int> stops, vector<int> period, vector<int> interval, int n, int s) { // write code here int WaitTime[n],BusTime[n],Time[n]; int MinTime=65535; for(int i=0;i<n;i++) { if(s%interval[i]==0) { WaitTime[i]=0; } else { WaitTime[i]=interval[i]-s%interval[i]; } BusTime[i]=(stops[i]+1)*5+period[i]*stops[i]; Time[i]=s+WaitTime[i]+BusTime[i]; if(Time[i]<MinTime) MinTime=Time[i]; } return MinTime ; } };
class TakeBuses { public: int chooseLine(vector<int> stops, vector<int> period, vector<int> interval, int n, int s) { int min=1000; for(int i=0;i<n;++i){ int wait=s%interval[i]?interval[i]-s%interval[i]:0; int t=(1+stops[i])*5+stops[i]*period[i]+s+wait; min=min>t?t:min; } return min; } };
public static int chooseLine(int[] stops, int[] period, int[] interval, int n, int s) { // write code here int minTime = Integer.MAX_VALUE; for(int i=0;i<n;i++){ int waitCarTime = s%interval[i] == 0 ? 0 : interval[i] - s%interval[i]; minTime = Math.min(minTime, waitCarTime + (stops[i] + 1)*5 + stops[i]*period[i]); } return minTime + s; }
class TakeBuses { public: int chooseLine(vector<int> stops, vector<int> period, vector<int> interval, int n, int s) { // write code here int tmpSChuI; int minTime=10000; int tmpTime; for(int i=0;i<n;i++){ //这个是计算小明最快时间上车所经过的发车间隔的个数 tmpSChuI = (0 == s%interval[i])?s/interval[i]:s/interval[i]+1; //这个是计算小明多久才能到公司 tmpTime = tmpSChuI*interval[i] + stops[i]*period[i] + 5*(stops[i]+1); if(tmpTime<minTime){ minTime = tmpTime; } } return minTime; } };
class TakeBuses { public: int chooseLine(vector<int> stops, vector<int> period, vector<int> interval, int n, int s) { vector<int> time(n); for(int i=0;i<n;i++) time[i]=stops[i]*(period[i]+5)+5+((s%interval[i])?(interval[i]-s%interval[i]):0); return *min_element(time.begin(),time.end())+s; } };
class TakeBuses { public: int chooseLine(vector<int> stops, vector<int> period, vector<int> interval, int n, int s) { int min=100000; for(int i=0;i<n;i++){ int time=(stops[i]+1)*5+stops[i]*period[i]; int j; for(j=0;j*interval[i]<s;j++); if(time+j*interval[i]<min) min=time+j*interval[i]; } return min; } };
import java.util.*; public class TakeBuses { public int chooseLine(int[] stops, int[] period, int[] interval, int n, int s) { // write code here int min = Integer.MAX_VALUE; for(int i=0;i<n;i++){ int missTime = s%interval[i]; int waitCost = missTime==0?0:interval[i]-missTime; min = Math.min(min,waitCost+(stops[i]+1)*5+stops[i]*period[i]); } return min+s; } }
总时间 = 坐上车之前的时间 + 在车上的时间
在车上的时间 = (stop数 + 1) *5 + stop数 * period停车时间
坐上车之前的时间:
若interval大于s 即人来之前第一班车已经走了需要等下一班 坐上车之前的时间 = interval
class TakeBuses { public: int chooseLine(vector<int> stops, vector<int> period, vector<int> interval, int n, int s) { int sumt, min_t = 1e7; for(int i = 0; i < n; i++){ sumt = stops[i]*period[i] + (stops[i] + 1)*5; int yushu = s % interval[i]; if(yushu == 0) sumt += s; else sumt += (s + interval[i] - yushu); min_t = min(min_t, sumt); } return min_t; } };
import java.util.*; //等车的时间最短+等的车用时最短 public class TakeBuses { public int chooseLine(int[] stops, int[] period, int[] interval, int n, int s) { // write code here int wait = 0, use = 0, min = Integer.MAX_VALUE; for(int i=0;i<n;i++){ int t = 0; while(t*interval[i]<s) t++; wait = t*interval[i] - s; use = stops[i]*period[i]+5*(stops[i]+1); min = Math.min(wait+use,min); } return min+s; } }
class TakeBuses { public: int chooseLine(vector<int> stops, vector<int> period, vector<int> interval, int n, int s) { // write code here int ans = INT_MAX; for(int i=0;i<n;++i) { int cur_time = 0; // 出发这个时间点需要坐第几趟车 while(s>cur_time) cur_time+=interval[i]; // 实际的出发时间 + 所有停站时间 + 路上走的时间 // k个停站相当于有k+1个间隔 每个间隔5分钟 ans = min(ans,cur_time + stops[i]*period[i]+(stops[i]+1)*5); } return ans; } };
import java.util.*; public class TakeBuses { public int chooseLine(int[] stops, int[] period, int[] interval, int n, int s) { int[] min = new int[n]; for (int i = 0; i < n; i++) { //路上停站时间与行车时间之和 min[i] = stops[i] * period[i] + (stops[i] + 1)*5; if ( s % interval[i] == 0) { continue; }else { //出发等待时间 min[i] = min[i] + interval[i] - (s % interval[i]); } } Arrays.sort(min); return min[0] + s; } }
class TakeBuses {
public:
int chooseLine(vector<int> stops, vector<int> period, vector<int> interval, int n, int s) {
// write code here
int minarrive=INT_MAX;
int temp=0;
for(int i=0;i<n;i++){
temp=s/interval[i];
if(temp*interval[i]==s){
temp=s;
}else
temp=(temp+1)*interval[i];
temp+=(stops[i]+1)*5+(stops[i]*period[i]);
minarrive=min(minarrive,temp);
}
return minarrive;
}
};