您的位置:首页 > 编程语言 > C语言/C++

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;


}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  工作