Luogu T103180 しろは的军训列队 前缀和
作者:互联网
题目背景
しろは上了大一,第一件事情就是军训。
题目描述
在军训里,最让しろは讨厌的事情就是列队。因为教官总是不停的喊着:“补齐排面,补齐排面!”
有一天,しろは突然在站军姿的时候开始思考这么一个问题:
假设队列中有 nn 名同学,第 ii 个同学有一个初始的位置值 a_iai.教官一声令下之后,他们就都要向某一个位置补齐(即让他们所有人的位置值都变成同一个值)
但是每个同学由于高矮胖瘦等等原因,移动的时候付出的代价是不一样的。量化来说,第 ii 个同学让自己的位置值变化1需要付出 b_ibi 点代价。
现在しろは想知道,怎么才能够让大家付出的代价最小呢?
しろは向你保证,这个代价值不会超过 C++ 语言中 long long 的表示范围。
输入格式
第一行一个整数 nn 表示同学个数。
第二行 nn 个整数,为 aa
第三行nn 个整数,为 bb
输出格式
一行一个整数,表示最小的代价。
输入输出样例
输入 #15 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