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;
}
相关推荐
shehuiyuelaiyuehao6 分钟前
算法40,模拟运算,替换所有的问号
数据结构·算法·leetcode
linx2959 分钟前
阶段五讲义:STL 全貌——扔掉手写循环,学“动词“
c++
用户2049375549514 分钟前
从“能识别”到“稳定识别”:离线ASR在真实会议场景中的问题与工程优化实践
算法
handler0128 分钟前
【Linux】动态库、静态库使用与原理
linux·运维·服务器·c++·c·动态库·静态库
raindayinrain31 分钟前
c++并发--同步
c++·同步
鹿角片ljp34 分钟前
LeetCode 148:排序链表|归并排序、快慢指针找左中点与链表断开
算法
LabVIEW开发37 分钟前
LabVIEW字符串特殊字符检测兼容
算法·labview·labview知识·labview功能·labview程序
蛋先生DX1 小时前
内存安全翻车现场的罪魁祸首,根源就在这三步里?
c++·后端·编程语言
小七在进步1 小时前
C++入门(1)
java·jvm·c++
晴天的雨.9921 小时前
[C++算法]快乐数
数据结构·c++·算法