首页 > 分享 > 蓝桥杯2022年第十三届C++ C组省赛真题

蓝桥杯2022年第十三届C++ C组省赛真题

一天不A浑身难受呀 已于 2022-04-16 23:23:57 修改

于 2022-04-16 23:18:15 首次发布

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

记录一下傻逼的自己,debug五个小时结果是最后输出没开LL。。。

这题太多坑点了, 可能是做法的问题。

1: 二分x,找到最后一次技能升级最多能提升多少,也有贪心的感觉,

如果最后一次技能升级大于等于m次, 那么就在右区间找(肯定最后一次技能提升的最多,则答案最优)。

2: 有个大坑, 如果一个技能的最后一项刚好等于x的话, 不一定要把他加到答案中,应该记录其出现的次数,等其他最后一项大于x的用完了,如果还有剩余才应该用x。对应看代码: 

#include <iostream>

#include <cstring>

#include <algorithm>

#include <queue>

using namespace std;

typedef long long LL;

typedef pair<int,int>pii;

const int mod = 1e9 + 7 , INF = 0x3f3f3f3f , N = 1e6 + 10;

int a[N],b[N];

int n,m;

bool check(int x)

{

int cnt = 0;

for (int i = 1 ; i <= n ; i ++)

{

if (a[i] < x) continue;

cnt += 1 + (a[i] - x) / b[i];

if (cnt >= m)

return true;

}

return false;

}

int cc;

int main()

{

cin >> n >> m;

for (int i = 1 ; i <= n ; i ++)

cin >> a[i] >> b[i];

LL res = 0;

// 二分最后一次技能最多提升了多少攻击力

int l = 0,r = 1e6;

while (l < r)

{

int mid = l + r + 1 >> 1;

if (check(mid))

l = mid;

else

r = mid - 1;

}

int x = l;

for (int i = 1 ; i <= n ; i ++)

{

int t = 0;

if (a[i] < x)

continue;

t = (a[i] - x) / b[i] + 1;

if (a[i] - (t - 1) * b[i] == x)

{

t --;

cc ++;

}

if (m >= t)

{

m -= t;

res += (LL)t * (a[i] + a[i] - (t - 1) * b[i]) / 2;

}

else

{

t = m;

m = 0;

res += (LL)t * (a[i] + a[i] - (t - 1) * b[i]) / 2;

break;

}

}

res = res + (LL)min(m,cc) * x;

cout << res << endl;

}

相关知识

第十六届蓝桥杯大赛报名通知
第十六届蓝桥杯全国软件和信息技术专业人才大赛软件赛校内选拔赛的通知
关于第十六届蓝桥杯大赛的报名及培训通知
计算机学院教师积极参加第十六届蓝桥杯大赛省赛师资培训会
AI:互联网程序设计竞赛之蓝桥杯大赛的简介、奖项设置、大赛内容以及蓝桥杯与ACM(ICPC)的四个维度对比之详细攻略
C语言入门教程
P8812 [蓝桥杯 2022 国 C] 打折
【计算机
蓝桥杯大赛报名指南
第十三届省园艺博览会

网址: 蓝桥杯2022年第十三届C++ C组省赛真题 https://m.huajiangbk.com/newsview1595204.html

所属分类:花卉
上一篇: 阴阳师源博雅技能怎么升级 阴阳师
下一篇: qq三国10阶宝宝特殊技能升级需