其他分享
首页 > 其他分享> > Luogu T103180 しろは的军训列队 前缀和

Luogu T103180 しろは的军训列队 前缀和

作者:互联网

题目背景

しろは上了大一,第一件事情就是军训。

题目描述

在军训里,最让しろは讨厌的事情就是列队。因为教官总是不停的喊着:“补齐排面,补齐排面!”

有一天,しろは突然在站军姿的时候开始思考这么一个问题:

假设队列中有 nn 名同学,第 ii 个同学有一个初始的位置值 a_iai​.教官一声令下之后,他们就都要向某一个位置补齐(即让他们所有人的位置值都变成同一个值)

但是每个同学由于高矮胖瘦等等原因,移动的时候付出的代价是不一样的。量化来说,第 ii 个同学让自己的位置值变化1需要付出 b_ibi​ 点代价。

现在しろは想知道,怎么才能够让大家付出的代价最小呢?

しろは向你保证,这个代价值不会超过 C++ 语言中 long long 的表示范围。

输入格式

第一行一个整数 nn 表示同学个数。

第二行 nn 个整数,为 aa

第三行nn 个整数,为 bb

输出格式

一行一个整数,表示最小的代价。

输入输出样例

输入 #1
5
1 2 3 4 5
1 2 3 4 5
输出 #1
15

说明/提示

对于 10\%10% 的数据,保证所有的 a_iai​ 相等。

对于 40\%40% 的数据,保证 n \leq 100n≤100

对于 100\%100% 的数据,保证 n\leq 10^6n≤106,同时保证 1 \leq a_i,b_i \leq 10^91≤ai​,bi​≤109

做法如题。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 using namespace std;
 5 typedef long long ll;
 6 
 7 const int Maxn = 1e6+10;
 8 ll s[Maxn],qian,hou,n,ans = 9223372036854775807;
 9 
10 ll read(){
11     ll a = 0;char l = ' ',c = getchar();
12     while(c < '0'||c > '9')l = c,c = getchar();
13     while('0' <= c&&c <= '9')a = a*10+c-'0',c = getchar();
14     if(l == '-')return -a; return a;
15 }
16 
17 struct node{
18     int pl,w;
19     bool operator <(const node& x)const{
20         return pl < x.pl;
21     }
22 }a[Maxn];
23 
24 int main(){
25     n = read();
26     for(int i = 1;i <= n;i++)a[i].pl = read();
27     for(int i = 1;i <= n;i++)a[i].w = read();
28     sort(a+1,a+n+1);
29     for(int i = 1;i <= n;i++)s[i] = s[i-1]+a[i].w;
30     for(int i = n;i >= 1;i--)hou += (s[n]-s[i-1])*(a[i].pl-a[i-1].pl);
31     for(int i = 1;i <= n;i++){
32         qian += s[i-1]*(a[i].pl-a[i-1].pl);
33         hou -= (s[n]-s[i-1])*(a[i].pl-a[i-1].pl);
34         ans = min(ans,qian+hou);
35     }
36     printf("%lld",ans);
37 return 0;
38 }
AC代码

 

标签:同学,10,nn,Luogu,ll,long,leq,T103180,军训
来源: https://www.cnblogs.com/Wangsheng5/p/11666542.html