盗黄金(排序+前缀和+二分)

原题链接

题目大意:

叛军有 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] << " ";
	}
}

总结:

这就本题的解题思路,主要运用了排序+前缀和+二分的思想,整体思路是非常简单的,如果有更多有新意的题目,欢迎与我们一起交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值