题解:黑暗爆炸 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) 编辑 收藏 举报