信息奥赛一本通:1227:Ride to Office

本题是一道贪心算法解决的题目,这道题中需要我们给出最短到达目的地的时间,这个题中,人物每当遇到比自身快的人就会以相同的速度骑行。对于出发时间小于0的,如果速度比任务快,根本追不上,人物的速度与其无关,如果人物的速度比其快,那么人物的速度仍然保持,所以出发时间小于0的可以不用考虑。对于出发时间大于0的,也就是出发时间比人物慢,如果他比人物先到终点,就会相遇。人物的速度就会随之改变,两人并驾齐驱,到达终点,所以我们只需要找到所有出发时间大于0中,到达时间最短的即可。

#include <iostream>
#include <algorithm>
#include <cmath>
//贪心策略:
// 所有start>=0中,最先到终点的

using namespace std;
const int N = 1e4 + 10;
struct charlie {
	int v;
	int start;
	double arrtime;
}cha[N];
int main() {
	int n;
	while (cin>>n&&n!=0) {
		int _min = 0x3f3f3f3f;//定义一个最大数(10的9次幂),维护最小数
		for (int i = 0; i < n;i++) {
			cin >> cha[i].v >> cha[i].start;
			if (cha[i].start < 0)  continue;
			else {
				cha[i].arrtime = ceil(4500 / ((5.0 / 18.0) * cha[i].v) + cha[i].start);
				if (cha[i].arrtime < _min)_min = cha[i].arrtime;
			}	
		} 
		cout << _min << endl;
	}
	return 0;
}

To solve this problem, we can use the concept of relative speed. Let's consider the scenario step by step: 1. First, we need to find the person who sets off the earliest among all the riders. Let's call this person "earliestRider". The time when Weiwei arrives at his office will be equal to the set off time of "earliestRider" plus the time it takes for Weiwei to catch up with "earliestRider". 2. Next, we calculate the relative speed between Weiwei and "earliestRider". If Weiwei is faster than "earliestRider", he will catch up with them before they reach the office. Otherwise, Weiwei will need to wait for someone faster to catch up to him. 3. Once Weiwei catches up with "earliestRider", we update the set off time of "earliestRider" to the time when Weiwei catches up with them. 4. We repeat steps 1-3 until Weiwei reaches his office. Here's a sample C++ code that implements this logic: ```cpp #include <iostream> #include <vector> struct Rider { int setOffTime; int speed; }; int main() { int n; // number of riders (excluding Weiwei) std::cout << "请输入骑行人数(不包括Weiwei):"; std::cin >> n; std::vector<Rider> riders(n); std::cout << "请依次输入每位骑行人的出发时间和速度:" << std::endl; for (int i = 0; i < n; i++) { std::cin >> riders[i].setOffTime >> riders[i].speed; } int weiweiSpeed; std::cout << "请输入Weiwei的速度:"; std::cin >> weiweiSpeed; int weiweiArrivalTime = 0; while (true) { int earliestRiderIndex = -1; int earliestRiderTime = INT_MAX; // Find the earliest rider for (int i = 0; i < n; i++) { if (riders[i].setOffTime < earliestRiderTime) { earliestRiderTime = riders[i].setOffTime; earliestRiderIndex = i; } } // Calculate the time Weiwei takes to catch up with the earliest rider double timeToCatchUp = static_cast<double>(4.5) / (weiweiSpeed - riders[earliestRiderIndex].speed); if (earliestRiderTime + timeToCatchUp <= 60) { weiweiArrivalTime = earliestRiderTime + timeToCatchUp; riders[earliestRiderIndex].setOffTime += timeToCatchUp; } else { break; // Weiwei arrives at or after 60 minutes, stop the loop } } std::cout << "Weiwei到达办公室的时间为:" << weiweiArrivalTime << "分钟" << std::endl; return 0; } ``` In this code, we first input the number of riders (excluding Weiwei) and their set off times and speeds. Then we input Weiwei's speed. The program iterates until Weiwei arrives at or after 60 minutes, finding the earliest rider, calculating the time to catch up with them, and updating their set off time accordingly. Finally, it outputs Weiwei's arrival time at the office. Please note that this is a simplified implementation and doesn't handle all possible edge cases. You can modify and improve it based on your specific requirements. Let me know if you have any further questions!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值