P3051题解

题目链接

这道题是思维+数学题,实现起来其实很简单.

我们先假设Xi为i移到i+1的泥土数量. 我们因此可以得到以下式子:

然后我们从第一个土堆开始,注意土堆围成了一个环:

我们转换一下变为:

我们再枚举第二个:

我们可以把x1代入:

依次类推,我们列出通项:

令Ci = Bi-Ai,则通项转换为:

我们维护Ci的前缀和Si表示C1~Ci的和,我们就可以把式子转化为:

我们发现这些式子构成了一个绝对值不等式,而对于一个绝对值不等式当xn为S序列的中位数时和最小,这样x序列的和也就最小.

代码:

cpp 复制代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
int n,a[N],b[N],c[N],ans,mid;
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i]>>b[i];
	for(int i=1;i<=n;i++) c[i]=c[i-1]+a[i]-b[i];
	sort(c+1,c+n+1), mid=c[n/2+1];
	for(int i=1;i<=n;i++) ans+=abs(mid-c[i]);
	cout<<ans;
	return 0;
}
相关推荐
Jerry1 小时前
LeetCode 28. 找出字符串中第一个匹配项的下标
算法
Jerry3 小时前
LeetCode 459. 重复的子字符串
算法
哥不想学算法6 小时前
【C++】字符串字面量拼接
开发语言·c++
海石6 小时前
1500分的题目,确实有实力,不过还是我略胜一筹
算法·leetcode
海石6 小时前
【记忆化搜索】条条大路通AC,走好适合你的那一条,走到后再考虑走得快
算法·leetcode
Jerry8 小时前
LeetCode 151. 反转字符串中的单词
算法
a11177610 小时前
LM 算法迭代过程动画演示(SLAM)
算法
头茬韭菜10 小时前
Context 的生死抉择:四层压缩、截断算法与 Session Memory
算法·ai
Jerry10 小时前
LeetCode 541. 反转字符串 II
算法
Jerry11 小时前
LeetCode 344. 反转字符串
算法