T1: 城墙(sandcas.pas/cpp)
2016-06-11 16:42
232 查看
Description FJ居住的城堡有N个城墙(1<=N<=25,000),编号为1到N,每个城墙的高度为M_i(1<=M_i<=100,000),他想把城墙的高度按照某种顺序变成B_1,B_2,….B_N(1<=B_i<=100,000),由于工作量比较大,FJ雇佣了一些牛来帮忙提高或降低墙的高度,当然要付工资,提高一单位高度需要花费X(1<=X<=100),降低一单位高度需要花费Y(1<=Y<=100)。 FJ想用最少的钱来完成这项任务,请你帮助计算,保证答案在longint范围内。
Input 第1行:3个空格隔开的整数N,X和Y 第2到N+1行:第i+1行包含两个空格隔开的整数表示M_i和B_i Sample Input 3 6 5 3 1 1 2 1 2
Output Sample Output 11
方法:从小到大排序m,b,如果mi>bi ans就加上x*它们的差,否则,加上y*(bi-mi)。
代码献上:
“`
include
include
include
define F(i,x,y) for(int i=x;i<=y;i++)
using namespace std;const int maxn=25000+500;
int m[maxn],b[maxn];
int n,x,y;
long long ans=0;
int main()
{
freopen(“sandcas.in”,”r”,stdin);
freopen(“sandcas.out”,”w”,stdout);
scanf(“%d %d %d”,&n,&x,&y);
F(i,1,n) scanf(“%d %d”,&m[i],&b[i]);
sort(m+1,m+n+1); sort(b+1,b+n+1); F(i,1,n) { if(m[i]>b[i]) ans+=(m[i]-b[i])*y; else ans+=abs(b[i]-m[i])*x; } printf("%lld\n",ans); return 0;
}