UVa 10901: Ferry Loading III 装上车子过河去

阅读: 评论:0

UVa 10901: Ferry Loading III 装上车子过河去

UVa 10901: Ferry Loading III 装上车子过河去

原题链接:UVa 10901: Ferry Loading III

题目大意:使用渡船运输汽车,给定渡船的最大载车数n、渡河所需时间t(来去时间相同)。只要河两岸有车在等待运输,船就进入工作状态,将船运至对岸。超出载量的车就等下次船靠岸的时候再进行运输,船初始停靠在左岸。若船靠岸时没有车处于等待运输状态,则船停留直到两岸之一有车抵达。需要注意的是,若船停靠在左岸,但右岸比左岸先有车来,则船要空着开到右岸去运输右岸的车,反之亦然。

大致思路:有车来,船就进入工作状态,没车来就等到有车来。

#include <climits>
#include <string>
#include <iostream>
#include <queue>
using namespace std;#define MAXM 10000
int event[MAXM];
bool side[MAXM];
int times[MAXM];int main() {int c, n, t, m;cin >> c;while(c--) {cin >> n >> t >> m;for(int i = 0; i < m; i++) {string si;cin >> event[i] >> si;side[i] = si == "left";}queue<int> left, right, inBoat;bool inLeft = true;int arrivalTime = INT_MAX;int currEv = 0;while(currEv < m || arrivalTime != INT_MAX) {if(currEv != m && event[currEv] <= arrivalTime) {(side[currEv] ? left : right).push(currEv);if(arrivalTime == INT_MAX) arrivalTime = event[currEv];currEv++;} else {while(!pty()) {times[inBoat.front()] = arrivalTime;inBoat.pop();}pty() && pty()) {arrivalTime = INT_MAX;					} else {queue<int>& curr = inLeft ? left : right;while(!pty() && (int) inBoat.size() < n) {inBoat.push(curr.front());curr.pop();}arrivalTime = arrivalTime + t;inLeft = !inLeft;}}}for(int i = 0; i < m; i++) cout << times[i] << endl;if(c) cout << endl;}return 0;
}

代码分析:   使用三个数组分别存放:汽车抵达时间、抵达哪一边、最终到达对岸的时间。再用三个队列分别存放:左岸处于等待状态的汽车、右岸处于等待状态的汽车、处于运输状态的汽车。当船处于初始状态或空闲状态时,抵达时间arrivalTime都为INT_MAX,直到有车来再将其置为该车的抵达时间。状态变量inLeft用于判断当前船在左边还是右边。另外,37-46行代码为关键部分,意思是:若没有车处于等待状态,则船靠在当前岸等待;若有车在等,则不论当前停靠的岸上有没有车,船都要过河(若有车,则要运输,要过河;若无车,则对面有车在等,还是要过河)。

本文发布于:2024-01-28 13:27:58,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/17064196827740.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:装上   车子   UVa   Ferry   III
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23