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;
}
相关推荐
wyiyiyi2 小时前
【数据结构+算法】迭代深度搜索(IDS)及其时间复杂度和空间复杂度
数据结构·人工智能·笔记·算法·深度优先·迭代加深
深思慎考2 小时前
LinuxC++——etcd分布式键值存储系统API(libetcd-cpp-api3)下载与二次封装
linux·c++·etcd
合作小小程序员小小店2 小时前
桌面预测类开发,桌面%性别,姓名预测%系统开发,基于python,scikit-learn机器学习算法(sklearn)实现,分类算法,CSV无数据库
python·算法·机器学习·scikit-learn·sklearn
洛_尘2 小时前
数据结构--4:栈和队列
java·数据结构·算法
Jiezcode3 小时前
LeetCode 138.随机链表的复制
数据结构·c++·算法·leetcode·链表
zhengjianyang&1233 小时前
美团滑块-[behavior] 加密分析
javascript·经验分享·爬虫·算法·node.js
翟天保Steven3 小时前
ITK-基于欧拉变换与质心对齐的二维刚性配准算法
算法
那个什么黑龙江3 小时前
关于C++中的“类中的特殊成员函数”
开发语言·c++