原题链接
题目大意:
叛军有 s 艘太空船,每艘都有一定的攻击力 a 。帝国有 b 个基地,每个基地都有一定的防御能力 d 和一定量的金 g 。
宇宙飞船可以攻击所有防御力小于等于其攻击力的飞船,与此同时,该基地的所有黄金都会被盗走。
第一行输入两个整数 s ,b 。
接下来 s 行输入每个太空船的攻击力 ai。
最后 b 行输入当前基地的 di 和 gi
输出 s 个数,分别表示第 i 个宇宙飞船能盗走的最大黄金。
输入输出样例
输入 #1
5 4
1 3 5 2 4
0 1
4 2
2 8
9 4
输出 #1
1 9 11 9 11
解题思路:
首先,先以基地的血量从小到大排序,再用一个前缀和将黄金的数量累加上去,为了不让每个飞船的答案不超时,我们得用二分来找到答案。
代码实现:
#include<iostream>
#include<utility>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
pair<int, int> a[N];
ll q[N];
int x[N];
int main()
{
int s, b;
cin >> s >> b;
for (int i = 1; i <= s; i++)
cin >> x[i];
for (int i = 1; i <= b; i++)
{
cin >> a[i].first >> a[i].second;
}
sort(a + 1, a + b + 1);
for (int i = 1; i <= b; i++)
q[i] = q[i - 1] + a[i].second;
for (int i = 1; i <= s; i++)
{
int l = 0, r = b;
while (l < r)
{
int mid = (l + r + 1) >> 1;
if (a[mid].first <= x[i]) l = mid;
else r = mid - 1;
}
cout << q[l] << " ";
}
}
总结:
这就本题的解题思路,主要运用了排序+前缀和+二分的思想,整体思路是非常简单的,如果有更多有新意的题目,欢迎与我们一起交流。