首页 > 其他分享 >蓝桥2129 技能升级(二分)

蓝桥2129 技能升级(二分)

时间:2024-11-29 16:46:16浏览次数:5  
标签:二分 升级 cnt 2129 Bi 蓝桥 int 技能

小蓝最近正在玩一款 RPG 游戏。他的角色一共有 N个可以加攻击力的技能。

其中第 i 个技能首次升级可以提升 Ai​ 点攻击力, 以后每次升级增加的点数都会减少 Bi。Ai/Bi (上取整) 次之后, 再升级该技能将不会改变攻击力。

现在小蓝可以总计升级 M 次技能, 他可以任意选择升级的技能和次数。请 你计算小蓝最多可以提高多少点攻击力?

 

思路一:暴力写法,优先队列(60pts)

将技能数值插入大根堆,取出后减去Bi在放回堆中。

#include <bits/stdc++.h>//暴力写法,堆O(mlogn) 
#define int long long
using namespace std;
int n, m, ans;
priority_queue<pair<int, int> > q;
bool operator < (const pair<int, int> &a, const pair<int, int> &b) {
    return a.first < b.first;
}
signed main() {
    cin >> n >> m;
    for (int i = 1; i <= n; i ++) {
        int x, y; cin >> x >> y;
        q.push(make_pair(x, y));
    }
    for (int i = 1; i <= m; i ++) {
        int x = q.top().first, y = q.top().second;
        q.pop();
        ans += x;
        if (x - y > 0) q.push(make_pair(x - y, y));
    }
    cout << ans;
}

 

思路二:二分(100pts)

每次用一个技能后都会减去Bi,我们要升级m次,可以理解为n个不同的等差数列合并,取其中最大的m个。

给你一堆数,找其中最大的m个数求和,我们考虑用二分的做法,二分第m大的数x, check部分的工作是找到大等于x的个数cnt,如果大等于m, 记录答案,更新l;如果小于m,更新r。这样就可以找到x。

在累加答案的过程中,注意x可能重复,所以我们先对大于x的数累加(等差数列求和公式),统计个数cnt,那么最后剩余m-cnt个x再加到答案上去。

(注意二分的写法,这里采用的是while(l<=r) l=mid+1,r=mid-1, 同时用x记录可能的答案mid)。

#include <bits/stdc++.h>//二分 
#define int long long
using namespace std;
const int N = 1e5 + 10;
int n, m, A[N], B[N], ans;
bool check(int x) {//找大等于x的个数 
    int cnt = 0;
    for (int i = 1; i <= n; i ++) {
        if (A[i] < x) continue;
        int k = (A[i] - x) / B[i];
        cnt += k + 1;
    }
    if (cnt >= m) return 1;
    else return 0;
}
signed main() {
    cin >> n >> m;
    for (int i = 1; i <= n; i ++) {
        cin >> A[i] >> B[i];
    }
    int l = 0, r = 1e6 + 10, x;
    while (l <= r) {
        int mid = (l + r) >> 1;
        if (check(mid)) l = mid + 1, x = mid;
        else r = mid - 1;
    }
    int cnt = 0;
    for (int i = 1; i <= n; i ++) {
        if (A[i] < x) continue;
        int k = (A[i] - x) / B[i];
        if ((A[i] - x) % B[i]) k ++;
        cnt += k;
        ans += ((2 * A[i] - (k - 1) * B[i]) * k / 2);
    }
    ans += (m - cnt) * x;
    cout << ans;
}

 

标签:二分,升级,cnt,2129,Bi,蓝桥,int,技能
From: https://www.cnblogs.com/love-lzt/p/18577041

相关文章

  • 蓝桥2128 重新排序(差分)
    给定一个数组A和一些查询Li和Ri,求数组第Li个至第Ri个元素之和。小蓝觉得这个问题很无聊,于是他想重新排列一下数组,使得最终每个查询结果的和尽可能地大。小蓝想知道相比原数组,所有查询结果的总和最多可以增加多少?大致思路:m次查询,每次求Li至Ri之和,我们可以用差分统计每个位......
  • [CSP-S 2024] 超速检测(二分+大模拟)
    题目传送门https://www.luogu.com.cn/problem/P11232都怪比赛时的自己太懒了,只做了特殊性质A的20pts。解题思路首先,我们可以把每辆超速的车的超速区间算出来(这个可以用二分解决)。这样可以解决第一个小问(有多少辆车会被测出超速)。对于第二个小问,我们可以做一个类似于线......
  • 【机器学习】什么是逻辑回归?从入门到精通:掌握逻辑回归与二分类问题的解决之道
    从入门到精通:掌握逻辑回归与二分类问题的解决之道引言1.1逻辑回归简介1.2逻辑回归的应用场景逻辑回归基本原理2.1逻辑回归概述逻辑回归的基本思想预测类别的概率2.2线性模型与Sigmoid函数线性模型Sigmoid函数Sigmoid函数的性质为什么选择Sigmoid函数2.3逻辑回归......
  • 【二分+前缀和+后缀和】codeforces 2026 D. Sums of Segments
    题目https://codeforces.com/problemset/problem/2026/D题意第一行输入一个正整数\(n(1\leqn\leq3e5)\),第二行输入\(n\)个整数\(a_1,a_2,...,a_i,...,a_n(-10\leqa_i\leq10)\),第三行输入一个正整数\(q(1\leqq\leq3e5)\),随后\(q\)行,每行输入两个整数\(......
  • 蓝桥3511飞机降落
    样例输入230100101010100220301020101020201020样例输出YESNO思路:具体来说,对于每架飞机,有起飞时间(t)、降落时间限制(d)和飞行时长(l)等信息,代码要判断能否按照一定规则安排这些飞机的起降顺序,使得所有飞机都能在其降落时间限制内完成降落。代码展示:#incl......
  • 二分
    前言答案属于一个区间,当这个区间很大时,暴力超时。但重要的是这个区间是对题目中的某个量有单调性的,此时,我们就会二分答案。每一次二分会做一次判断,看是否对应的那个量达到了需要的大小。模板模板1while(l<r){intmid=l+r>>1; //(l+r)/2if(check(mid))r......
  • 二分查找的区间到底是开还是闭?
    二分查找的区间到底是开还是闭?在这两个月的时间里,我似乎没有产出任何的有关知识点的文章,大多数都是题解相关的内容。以至于许多人觉得Macw07“失踪”了。本文是我来到北美之后的第一篇知识点文章,请大家多多关照。这次不讲难的知识点了,讲一个大家都熟悉的,但又非常令人抓毛的......
  • 二分查找2
    //1111111111.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。///*http://oj.daimayuan.top/course/16/problem/60给一个序列a1,a2,…,an和m个询问。每次询问给出两个数l,x,求最大的r(r≤n)满足al+al+1+⋯+ar≤x。如果不存在这样的r,即al>x,输出......
  • 蓝桥杯c++算法秒杀【6】之动态规划【下】(数字三角形、砝码称重(背包问题)、括号序列、
    别忘了请点个赞+收藏+关注支持一下博主喵!!!! ! ! ! !关注博主,更多蓝桥杯nice题目静待更新:)动态规划三、括号序列【问题描述】        给定一个括号序列,要求尽可能少地添加若干括号使得括号序列变得合法,当添加完成后,会产生不同的添加结果,请问有多少种本质......
  • ABAP开发学习——二分法查找问题记录
    在ABAP中使用二分法查找之前需要注意内表需要提前经过排序,尤其注意根据哪个字段使用BINARYSEARCH,就要针对哪个字段进行排序。使用两个及以上字段更要注意这一点,不可以用AB排序,再用BC去二分法查找,这样通常是读不到所需数据的。TYPES:BEGINOFty_data,field1TYP......