Codeforces Round #740 C. Deep Down Below

题目链接

题意

n n n个洞穴,每个洞穴有 k i k_i ki个怪物,每个怪物都有一个防御力 a i , j a_{i,j} ai,j

英雄有一个初始攻击力 S S S,当英雄的攻击力严格大于怪物的防御力时英雄可以击杀怪物,英雄击杀怪物时攻击力会加 1 1 1

英雄可以选择一个洞穴从头到尾击杀这个洞穴的所有怪物,如果不能击杀则游戏结束

问英雄的初始攻击力最小值是多少时英雄可以杀掉所有怪物

思路

设英雄进入洞穴时攻击力为 S S S,当打到第 j j j个怪物时攻击力为 S + j ( j > = 0 ) S+j(j >= 0) S+j(j>=0) 所以只需要求出 每个洞穴的 m a x ( a i , j − j ) + 1 max{(a_{i,j}-j)+1} max(ai,jj)+1即为英雄进入该洞穴的初始攻击力最小值

我们肯定先攻击 m a x ( a i , j − j ) + 1 max{(a_{i,j}-j)+1} max(ai,jj)+1最小的洞穴(打怪升级再打boss),所以只需要对 m a x ( a i , j − j ) + 1 max{(a_{i,j}-j)+1} max(ai,jj)+1排序后遍历即可

Code

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
ll read() {
    ll x = 0, f = 1;
    char c = getchar();
    while (c < '0' || c > '9') {
        if (c == '-') f = -1;
        c = getchar();
    }
    while (c >= '0' && c <= '9')
        x = (x << 1) + (x << 3) + c - '0', c = getchar();
    return f * x;
}
pair<ll,ll> maxi[100005];
ll a[100005];
void solve() {
    int n = read();
    for (int i = 0; i < n; ++i) maxi[i].first = 0;//英雄进攻改巢穴需要的最小攻击力
    for (int i = 0; i < n; ++i) {
        int k = read();
        maxi[i].second = k;
        for (int j = 0; j < k; ++j) {
            a[i] = read() - j + 1;
            maxi[i].first = max(maxi[i].first, tmp[j]);
        }
    }
    sort(maxi, maxi + n);
    ll now = 0,tmp = 0;//所需最小攻击力   打怪后加的攻击力
    for (int i = 0; i < n; ++i) {
        if (now + tmp < maxi[i].first) now = maxi[i].first - tmp;
        tmp += maxi[i].second;
    }
    cout << now << endl;
}

int main() {
    int _;
    cin >> _;
    while (_--) solve();
    return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值