[CCF-1239] [CSP-X2023山东小学组]代价
No tag
Problem Discussion Statistic Solutions
Time Limit:C/C++ 1000MS,Other 2000MS
Memory Limit:C/C++ 256MB,Other 512MB
Level:very easy
Score:100 OI Rank Score:10(0.1*Score+2*Level)
Created By:zhuby
Description
因为“黑发不知勤学早”,于是小明成为了一名伟大的流水线工人,天天起早摸黑打螺丝。
这一天,小明所在的流水线生成了 n 件产品,其中第 i 号产品规格用一个正整数 ai表示。
所谓流水线,就是需要标准化。于是,小明想把这 n 件产品规格修整得全部相同。
小明手边有两种工具来进对产品进行修整,但是使用不同工具需要花费不同的代价,小明可以进行以下操作任意次:
- 使用一次第一种工具花费 A 的代价将第 i 件产品的规格 ai 修改成 ai + 1(其中i ∈ [1, n])。
- 使用一次第二种工具花费 B 的代价将第 i 件产品的规格 ai 修改成 ai − 1(其中i ∈ [1, n])。
现在小明想要花费最少的代价将所有产品的规格都变得相同,于是他找到了自幼勤学苦练的你来帮忙。
你只需要计算出把所有产品调整为相同规格的最小代价即可。
Input
第一行三个正整数 n,A,B,分别表示产品数量,使用一次第一种工具的代价 A 和使用一次第二种工具的代价 B。
第二行 n 个正整数 a1,a2,...,an 表示每件产品的产品规格。
Output
一行一个整数表示最小的总代价。
Sample Input 1
3 1 1 1 2 5
Sample Output 1
4
Sample Input 2
3 1 100 1 2 5
Sample Output 2
7
Sample Input 3
3 2 5 9999999999 9999999999 9999999999
Sample Output 3
0
Hint
【样例 1 解释】
两种操作的代价相等,所以把所有产品规格修改成 2 花费的代价最小,计算可得最小代价为 4(1 变为 2,5 变为 4,4 再变为 3,3 再变为 2,已经规格相同,共 4 次)。
【样例 2 解释】
因为二操作代价 B 太大,所以把所有产品规格修改成 5 花费代价最小,计算可得最小代价为 7(用一操作,1 变为 5 需要 4 次,2 变为 5 需要 3 次,共 7 次)
【数据范围】
对于 30% 的数据,1≤n≤10,1≤ai≤100,1≤A,B≤10;
对于 60% 的数据,1≤n≤105,1≤ai≤105,1≤A,B≤100;
其中有 30% 的数据,A=B;
对于 100% 的数据,1≤n≤10^5,0≤ai≤10^9,1≤A,B≤10000。
AC:(算法):
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
long long a[N],s[N];
int main(){
int n,x,y;
scanf("%d%d%d", &n, &x, &y);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
sort(a+1,a+n+1);
for(int i=1;i<=n;i++)s[i]=s[i-1]+a[i];
long long ans=(s[n]-a[1]-(n-1)*a[1])*y;
for(int i=1;i<=n;i++){
long long temp=((i-1)*a[i]-s[i-1])*x+(s[n]-s[i]-(n-i)*a[i])*y;
ans=min(temp, ans);
}printf("%lld\n",ans);
return 0;
}