codeforces Covered Path

本文介绍了一道基于贪心算法的题目,通过调整每分钟的速度增量来最大化总行程,同时确保相邻分钟间速度差不低于特定值。文章提供了详细的思路解析及C++实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是一道贪心题,思路就是在这t分钟内,使得每一分钟的速度尽量的大,而且相邻的两分钟速度之间的差不小于d。要满足这个条件,在开始的第二分钟和倒数第二分钟速度最大分别为第一分钟加上d和最后一份总加上d,然后在吧这两个看做第一分钟和倒数第一分钟,按上面的思路走就行了,直到他们达到t/2。这只是一个大致思路,首先还要判断刚开始的第一分钟和倒数第一分钟这两分钟的差值是否大于d,若大于d就要先使它们之间的差值小于d才能开始两边都开始加上d。还要判断t是奇数还是偶数。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int main() {
	int v1,v2,t,d,ans=0;
	cin>>v1>>v2>>t>>d;
	t-=2;
	ans+=v1+v2;
	if(abs(v1-v2)>d &&t) {
		if(v1<v2) {
			while(abs(v1-v2)>d && t) {
				v1+=d;
				ans+=v1;
				t--;
			}
		}
		else {
			while(abs(v1-v2)>d && t) {
				v2+=d;
				ans+=v2;
				t--;
			}
		}
	}
	while(t && t%2==0) {
		v1+=d;
		v2+=d;
		ans+=v1+v2;
		t-=2;
	}
	while(t && t%2) {
		if(t==1) {
			if(v1<v2) ans+=v1+d;
			else ans+=v2+d;
			t--;
		}
		else {
			v1+=d;
			v2+=d;
			ans+=v1+v2;
			t-=2;
		}
	}
	cout<<ans<<endl;
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值