题目:给公交车发车时间表buses,以及乘客到达站点时间passengers。buses不同时,乘客也不同时。以及bus容量capacity。求你的最晚上车时间(不能和乘客同时)。
思路:贪心。尽量做最晚那班车,不用排队就最后上车。要排队就找到最晚上车的人,在他前面插队。
int latestTimeCatchTheBus(vector<int>& buses, vector<int>& passengers, int capacity) {
//要排队:能坐最后一辆车的最后一个人,在他之前插队上车就行。
//不用排队就最晚一辆车时间就行。
int bus = 0;//标记要发车的bus下标
int peo = 0;//第一个未上车的人。
int curcap = capacity;//当前剩余座位
sort(buses.begin(),buses.end());
sort(passengers.begin(),passengers.end());
while(bus < buses.size() && peo < passengers.size()){//模拟上车
curcap = capacity;
while(peo < passengers.size() && passengers[peo] <= buses[bus] && curcap > 0){//能上的都上
curcap--;
peo++;
}
bus ++;//不行下一辆
}
int lastpeo = peo-1;//最后一个上车的
if(lastpeo < 0) return buses.back();//没人上
//还有车 或者 (还能上 && 最后一个人不是踩点)
if(bus < buses.size() || (curcap > 0 && passengers[lastpeo] != buses.back())) return buses.back();
//否则往前插队就行
int res = passengers[lastpeo];
while(lastpeo >= 0 && passengers[lastpeo] == res) {
lastpeo --;
res --;
}
return res;
}