jiejiejiang2004

题解:黑暗爆炸 3399[签到题]

黑暗爆炸 3399

题面

Description

约翰用沙子建了一座城堡.正如所有城堡的城墙,这城墙也有许多枪眼,两个相邻枪眼中间那部分叫作城齿
城墙上一共有 \(N(1≤N≤25000)\) 个城齿,每一个都有一个高度 \(M~i~(1≤M~i~≤100000)\)
现在约翰想把城齿的高度调成某种顺序下的 \(B~i~\)\(B~2~\) ,…, \(B~N~(I≤B~i~≤100000)\) .

  • 一个城齿每提高一个单位的高度,约翰需要 \(X(I≤X≤100)\) 元;
  • 每降低一个单位的高度,约翰需要 \(Y(1≤y≤100)\) 元.

问约翰最少可用多少钱达到目的.数据保证答案不超过 \(2^{32}\)

Input

第1行输入3个整数 \(N\)\(X\)\(Y\) .
第2到N+1行每行输入两个整数 \(M~i~\)\(B~i~\)

Output

最少花费.

Sample Input

3 6 5
3 1
1 2
1 2

Sample Output

11

Hint

\(1\) 个城齿降低 \(1\) ,第 \(2\) 个城齿提高 \(1\)

我的题解

先说结论:签到题
两个数组排序
然后求差值
再分类讨论求和
就行了

一开始我看到城墙的时候
我认为城墙是不可移动的
但是Hint又说:第 \(1\) 个城齿降低 \(1\) ,第 \(2\) 个城齿提高 \(1\)
我以为是那就要这个城齿能和隔壁的城齿交换
想来想去都不对
后面看过的人多了才这么写的
真让人头大

我的代码

#include <iostream>
#include <algorithm>

#define int long long

int t;
const int N = 1e7;
int a[N];
int b[N];

void solve()
{
    int n,x,y,ans = 0;
    std::cin >> n >>x >> y;
    for(int i = 0 ; i < n ; i ++)
        std::cin >> a[i] >> b[i];

    std::sort(a,a+n);
    std::sort(b,b+n);

    for(int i = 0 ; i < n ; i ++)
    {
        if(a[i] > b[i]) ans += y * (a[i] - b[i]);
        else ans += x * (b[i] - a[i]);
    }

    std::cout << ans << "\n";
}

signed main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);

	t = 1;
	//std::cin >> t;
	
	while(t--)
	{
		solve();
	}
    return 0;
}


有什么出现纰漏的地方还请大家在评论区指出!谢谢!

posted on 2024-07-14 13:32  Jiejiejiang  阅读(2)  评论(0编辑  收藏  举报

导航