#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
#define x first
#define y second
long long pre[N],aft[N];
pair<int,int> a[N];
int main(){
int n;
long long s=0;
cin >> n;
for(int i=1;i<=n;i++){
cin >> a[i].y >> a[i].x;
}
sort(a+1,a+1+n);
for(int i=1;i<=n;i++){
pre[i]=pre[i-1]+s*(a[i].x-a[i-1].x);
s=s+a[i].y;
}
s=0;
for(int i=n;i>=1;i--){
aft[i]=aft[i+1]+s*(a[i+1].x-a[i].x);
s=s+a[i].y;
}
long long les=1e18;
long long b=0;
for(int i=1;i<=n;i++){
b=pre[i]+aft[i];
les=min(b,les);
}
cout << les;
}
要点:
* s表示i-1块石头整体向后移动一个距离的价格,且在换数组时要进行重置。
1.运用pair类型的数组存放每个石头的一对数据,在输入使先输入.y,再输入.x;这样可以得每块石头的位置内容存放在pair的第一位,为后续排序做准备;
2运用sort升序排序为每个位置的石头排好顺序,时间复杂度为nlog(n)。
3.运用前缀和思想在计算i位置前所花费的总和和i后移动至i所花费的综合。前缀和思想简化了大量的计算,只要在前一位的基础上进行少量计算即可。
4.最后运用min函数求出最小值。(min函数只能取相同类型的最小值,int 和long long类型就不可以,所以要注意保持一致。)