第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC)

1.技能升级

1.题目描述

小蓝最近正在玩一款 RPG 游戏。
他的角色一共有 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC) 个可以加攻击力的技能。

其中第 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC)个技能首次升级可以提升 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC)点攻击力,以后每次升级增加的点数都会减少 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC)第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC)(上取整)次之后,再升级该技能将不会改变攻击力。

现在小蓝可以总计升级 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC) 次技能,他可以任意选择升级的技能和次数。

请你计算小蓝最多可以提高多少点攻击力?

2.输入格式

输入第一行包含两个整数 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC)第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC)
以下 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC) 行每行包含两个整数 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC)第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC)

3.输出格式

输出一行包含一个整数表示答案。

4.样例输入

3 6
10 5
9 2
8 1

5.样例输出

47

6.数据范围

第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC)

7.原题链接

技能升级

2.解题思路

根据题意思考虑,每一个技能的提升点数都会是一个递减的等差序列,首项为 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC),公差为 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC),那么对于第 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC) 个序列应为:
第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC)
出于贪心考虑,我们每次将升级当前最大的 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC),这样选够 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC) 次一定为正确答案,所以我们可以使用优先队列模拟,这样的复杂度为 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC)第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC) 最大值为 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC),这样会TLE

考虑完成所有选择以后,我们选择的情况一定如下图(红色表示已选),即每个技能一定在其头部选择了若干个元素,总共需要选够 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC) 个元素,因为每个数组都是递减的,所以选择的所有元素一定是所有元素的前 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC) 大的元素。那么这就是一个多路归并问题。
在这里插入图片描述

什么是多路归并呢,这里顾名思义就是直接将所有序列合起来,以题目样例举例:
技能1第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC) 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC)
技能2第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC) 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC) 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC) 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC) 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC)
技能3第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC) 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC) 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC) 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC) 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC) 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC) 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC) 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC)
我们将三个序列合并后按从大到小进行排序得到新序列 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC):
第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC)

样例的 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC)6,那么答案即为最大前6个元素之和,这就是多路归并的思想,由贪心可知这样的选择一定正确且我们可以通过在题目的要求下完成如此选法。但显然我们如果暴力存储然后排序仍会TLE,考虑如何去进行优化。

首先思考多路归并的数组对我们有什么作用?答案是我们可以求解得到我们选择的第 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC) 个数是多少,定义 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC) 为所有数列中大于等于 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC) 的数有多少个。

第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC)的定义可知,若某个值 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC) 满足第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC),那么数列中所有大于等于 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC) 的数恰好就是前 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC) 大的数。又可知当第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC)时,一定满足 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC),所以当 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC) 满足第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC)时,第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC)也一定满足,而第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC)却不一定满足,由此符合二段性,所以我们可以去二分求解得到 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC),其实就是求满足 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC) 的最大值。

比如样例中二分求得的 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC) 就是 6,因为 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC),那么我们把所有大于等于6的数都选上即是答案。

但是已知 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC),如何求得第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC)?对于第 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC) 个数列,我们可以选择的个数为 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC),那么对于任意一个 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC) 我们都可以在第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC)的时间复杂度求得 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC)。加上我们二分的复杂度为 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC),那么我们可以在第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC)的复杂度求解得到 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC)

得到 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC) 之后就简单了,我们只需要把每个数列中大于等于 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC) 的值都选上即可。这也很好求解,由于是等差数列,那么每个数组可选的个数为 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC),首项为 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC),那么末项为 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC),已知首项末项以及项数,根据等差数列求和公式 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC)可以求出每一列我们选的总和。

需要注意的是,我们求解的 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC) 是满足 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC)并不一定恰好是 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC),因为原数列中可能有多个 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC),我们可能会选多,所以还需要记录下我们总共选了多少个数,最后减去多余的 第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC)。比如如果样例中存在两个6,那么我们就会选到7个数,需要减去一个6
时间复杂度:第十三届蓝桥杯省赛 C++ C 组 I 题、Python B 组 H题——技能升级(AC)

3.Ac_code

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef unsigned long long uLL;
typedef pair<int, int> PII;
#define pb(s) push_back(s);
#define SZ(s) ((int)s.size());
#define ms(s,x) memset(s, x, sizeof(s))
#define all(s) s.begin(),s.end()
const int inf = 0x3f3f3f3f;
const int mod = 1000000007;
const int N = 200010;

LL n, m;
void solve()
{
	cin >> n >> m;
	std::vector<LL> a(n), b(n);
	for (int i = 0; i < n; ++i) cin >> a[i] >> b[i];
	auto check = [&](int x) {
		LL s = 0;
		for (int i = 0; i < n; ++i) {
			if (a[i] >= x) s += (a[i] - x) / b[i] + 1;
		}
		return s >= m;
	};
	int l = 0, r = 1e6;
	while (l < r) {
		int mid = l + r + 1 >> 1;
		if (check(mid)) l = mid;
		else r = mid - 1;
	}
	LL ans = 0, cnt = 0;
	for (int i = 0; i < n; ++i) {
		if (a[i] >= r) {
			//可取个数
			LL c = (a[i] - r) / b[i] + 1;
			//末项
			LL end = a[i] - (c - 1) * b[i];
			//求和
			ans += (a[i] + end) * c / 2;
			cnt += c;
		}
	}
	ans -= (cnt - m) * r;
	cout << ans << '\n';
}
int main()
{
	ios_base :: sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	int t = 1;
	while (t--)
	{
		solve();
	}
	return 0;
}

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
社会演员多的头像社会演员多普通用户
上一篇 2023年3月2日 下午10:32
下一篇 2023年3月2日 下午10:33

相关推荐