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(!inBoat.empty()) {
					times[inBoat.front()] = arrivalTime;
					inBoat.pop();
				}
				if(left.empty() && right.empty()) {
					arrivalTime = INT_MAX;					
				} else {
					queue<int>& curr = inLeft ? left : right;
					while(!curr.empty() && (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行代码为关键部分,意思是:若没有车处于等待状态,则船靠在当前岸等待;若有车在等,则不论当前停靠的岸上有没有车,船都要过河(若有车,则要运输,要过河;若无车,则对面有车在等,还是要过河)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
当您遇到 "error: failed to push some refs to 'gitee.com:ferry18829517728/vue_shop.git'" 这样的错误时,这通常表示在尝试将代码推送到 Gitee(一个类似的Git代码托管平台)时遇到了问题。可能的原因包括: 1. **网络连接问题**:确保您的网络连接稳定,如果使用代理服务器,请确认配置正确。 2. **权限问题**:检查您是否拥有足够的权限推送代码到指定的仓库。可能是登录凭证错误或仓库设置为私有。 3. **分支冲突**:如果有其他人正在修改同一分支,可能会出现推送冲突。解决冲突后重新尝试。 4. **SSH密钥问题**:如果你用的是SSH链接,确保SSH密钥已添加并配置正确。 5. **Git版本问题**:更新你的Git客户端到最新版本,有时候旧版本的Git可能无法处理某些新的操作。 6. **仓库克隆地址错误**:确认仓库地址是否正确无误。 要解决这个问题,请按照以下步骤操作: 1. 检查网络和凭证。 2. 清理本地缓存 (`git fetch --all && git reset --hard origin/your_branch`). 3. 解决任何存在的合并冲突。 4. 确保SSH密钥已经添加到Gitee账户中。 5. 如果以上都正常,试着删除远程分支再重新推送 (`git push --force`,但谨慎使用,因为它会覆盖远程分支上的所有更改)。 相关问题: 1. 什么是SSH链接在Git中的作用? 2. 如何检查和管理Git的SSH密钥? 3. 如何避免Git推送冲突并解决它们?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值