P3051题解

题目链接

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

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

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

我们转换一下变为:

我们再枚举第二个:

我们可以把x[1]代入:

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

令C[i] = B[i]-A[i],则通项转换为:

我们维护C[i]的前缀和S[i]表示C[1]~C[i]的和,我们就可以把式子转化为:

我们发现这些式子构成了一个绝对值不等式,而对于一个绝对值不等式当x[n]为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;
}
相关推荐
唯唯qwe-9 小时前
Day23:动态规划 | 爬楼梯,不同路径,拆分
算法·leetcode·动态规划
做科研的周师兄9 小时前
中国土壤有机质数据集
人工智能·算法·机器学习·分类·数据挖掘
深盾科技9 小时前
融合C++与Python:兼顾开发效率与运行性能
java·c++·python
代码村新手9 小时前
C++-入门
开发语言·c++
来深圳9 小时前
leetcode 739. 每日温度
java·算法·leetcode
神舟之光9 小时前
VSCode编译运行C/C++程序问题及解决方法
开发语言·c++
坐怀不乱杯魂9 小时前
C++ STL unordered_map/set 实现
开发语言·c++
yaoh.wang10 小时前
力扣(LeetCode) 104: 二叉树的最大深度 - 解法思路
python·程序人生·算法·leetcode·面试·职场和发展·跳槽
hetao173383710 小时前
2025-12-21~22 hetao1733837的刷题笔记
c++·笔记·算法
醒过来摸鱼10 小时前
递归三种分类方法
算法