问题描述
- 给你
n
n
n个英雄,每个英雄的能力值为
a
i
a_i
ai,然后有两条龙,你必须派一个英雄去杀其中一条龙,然后派其他的英雄去防御另外一条龙。
- 注意,你选择的英雄的能力值必须要比龙的能力值大,并且,你可以用
1
c
o
i
n
1coin
1coin去提升一位英雄的能力值(当然只提升
1
1
1点)。要你求能杀死一条龙并且防御另外一条龙的最小代价。
思路分析
- 我们直接找到刚好比第一条龙能力值大于等于或者小于等于的英雄去杀那条龙,比较一下两种情况的代价大小即可。
代码如下
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn = 2e6 + 10;
ll a[maxn];
ll sum;
signed main()
{
ll n;
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n;
for (ll i = 1; i <= n; i++)
{
cin >> a[i];
sum += a[i];
}
sort(a + 1, a + 1 + n);
ll t;
cin >> t;
while (t--)
{
ll sum1 = sum;
ll ans = 0;
ll x, y;
cin >> x >> y;
ll pos = lower_bound(a + 1, a + 1 + n, x) - a;
if (pos > n)
{
cout << x - a[n] + max(0ll, y - sum1 + a[n]) << endl;
}
else if (a[pos] == x)
{
cout << max(0ll, y - sum1 + x) << endl;
}
else
{
sum1 -= a[pos];
ans = max(0ll, y - sum1);
sum1 += a[pos];
if (pos != 1)
{
sum1 -= a[pos - 1];
ans = min(ans, x - a[pos - 1] + max(0ll, y - sum1));
}
cout << ans << endl;
}
}
return 0;
}