1 条题解
-
0
自动搬运
来自洛谷,原作者为

FFTotoro
龙猫搬运于
2025-08-24 23:09:31,当前版本为作者最后更新于2025-02-08 11:30:48,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
之前把这题搬进了模拟赛,直接把当时写的题解弄过来。
本题有结论:将坐标序列排序后,最终河狸聚成的形态必然形如“将连续的 只河狸或 只河狸分成一组”。如果将 只或更多只河狸移动到同一个位置,那么必然不优——以 只河狸为例,假设坐标分别为 ,那么如果全部移动到同一个位置,代价为 ,但是如果将它们两两分组,代价就为 ,显然后者不大于前者;更多只的情况可以类似地推导。
所以我们可以先将 排序,在这之后进行动态规划。设 为考虑了前 只河狸的最小代价,那么有如下两种转移:
- ;(将 和 分组)
- ;(将 、 和 分组)
时间复杂度为 。
放代码:
#include<bits/stdc++.h> using namespace std; int main(){ ios::sync_with_stdio(false); int n; cin>>n; vector<int> a(n),f(n); for(auto &i:a)cin>>i; sort(a.begin(),a.end()); f[1]=a[1]-a[0],f[2]=a[2]-a[0]; for(int i=3;i<n;i++) f[i]=min(f[i-2]+a[i]-a[i-1],i>3?f[i-3]+a[i]-a[i-2]:(int)2e9); // 进行 DP cout<<f[n-1]<<endl; return 0; }
- 1
信息
- ID
- 11418
- 时间
- 2000ms
- 内存
- 1024MiB
- 难度
- 3
- 标签
- (无)
- 递交数
- 0
- 已通过
- 0
- 上传者