【每日一题】26.codeJan与旅行 (贪心)

补题链接:Here

算法涉及:贪心

思路:

首先,我们处在p位置,显然要么向左走到相邻的城市,要么向右走走到相邻的城市。
有一个不会证明但观察到的结论,从这两个位置走的话,只有四种可能。
可能1:一直向左走
可能2:一直向右走
可能3:一直向左走到第i个城市,然后再向右走到第i+1个城市,然后再向左走到第i个城市,然后再向右走到第i+1个城市...
可能4:一直向右走到第i个城市,然后再向左走到第i-1个城市,然后再向右走到第i个城市,然后再向左走到第i-1个城市...

贴一个证明过程:Here

using ll = long long;
const int N = 1e5 + 6, M = 1e5;// val 1e9
void solve() {
	int n, m, p, pos = 0;
	cin >> n >> m >> p;
	ll a[n + 1];
	for (int i = 1; i <= n; ++i) {
		cin >> a[i];
		if (a[i] < p)pos = i;
	}
	ll ans = 1e18;
	for (int i = 1; i < n; ++i) {
		if (i <= pos) {
			if (pos - i  + 1 > m)continue;
			ll num = m - (pos - i + 1), dist = p - a[i];
			ans = min(ans, dist + num * (a[i + 1] - a[i]));
			if (num > 0 and pos + 1 <= n)
				ans = min(ans, (a[pos + 1] - p) * 2 + dist + (num - 1) *
				          (a[i + 1] - a[i]));
		} else {
			if (i - pos > m)continue;
			ll num = m - (i - pos), dist = a[i] - p;
			ans = min(ans, dist + num * (a[i + 1] - a[i]));
			if (num > 0 and pos >= 1)
				ans = min(ans, (p - a[pos]) * 2 + dist + (num - 1) *
				          (a[i + 1] - a[i]));
		}
	}
	cout << ans << endl;
}
posted @   RioTian  阅读(70)  评论(0编辑  收藏  举报
编辑推荐:
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 全程不用写代码,我用AI程序员写了一个飞机大战
点击右上角即可分享
微信分享提示