[CCF-1239] [CSP-X2023山东小学组]代价

[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;
}

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值