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;
}
相关推荐
Doro再努力16 小时前
【数据结构08】队列实现及练习
数据结构·算法
AI视觉网奇17 小时前
ue5 插件 WebSocket
c++·ue5
左直拳17 小时前
将c++程序部署到docker
开发语言·c++·docker
恒者走天下17 小时前
AI智能体通讯项目(底层AI通讯协议实现)
c++
英雄各有见17 小时前
Chapter 5.1.1: 编写你的第一个GPU kernel——Cuda Basics
c++·gpu·cuda·hpc
清铎17 小时前
leetcode_day12_滑动窗口_《绝境求生》
python·算法·leetcode·动态规划
linweidong17 小时前
嵌入式电机:如何在低速和高负载状态下保持FOC(Field-Oriented Control)算法的电流控制稳定?
stm32·单片机·算法
梵尔纳多17 小时前
OpenGL着色器语言(GLSL)
c++·opengl·着色器
net3m3317 小时前
单片机屏幕多级菜单系统之当前屏幕号+屏幕菜单当前深度 机制
c语言·c++·算法
mmz120717 小时前
二分查找(c++)
开发语言·c++·算法