Codeforces Round #740 (Div. 2) B C

本文探讨了在游戏开发中的两个关键问题。首先,详细解释了如何在Charmed by the Game中确定最后的破发球次数,通过分析两种可能的发球顺序,利用集合存储并去重得到所有可能的破发球情况。其次,介绍了Deep Down Below的策略,讨论了英雄击败所有洞穴怪兽所需的最小攻击力,通过分析每个洞穴的怪兽护甲值,找到进入每个洞穴的最小初始攻击力,并按顺序进入以达到最小总攻击力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

B. Charmed by the Game

题目大意:

A和B轮流发球,给出A和B的胜利场数a和b,但是不知道谁先发球,问最后破发球次数的所有可能。接球一方胜利即为破发球。

题解:

因为不知道谁先发球,所以可以分为两种情况, 一种为A先发球,另一种为B先发球

每个人发球的次数很容易得出来,定义x = (a + b) / 2,y = a + b - x 那么A要么发球x次,要么发球y次。

A发球x次:若A在发球中胜利i次,那么A就有a - i次破发球,B就有x - i破发球,a - i + x - i即为总破发球次数。

当然这里要注意 a - i <= y && i <= x;因为破发球是在接球过程,A发球x次,B就接球y次,发球胜利的场次必定不大于发球次数

A发球B次同理

代码如下:

void solve()
{
    int a, b; scanf("%d%d", &a, &b);
    int x = (a + b) / 2;
    int y = a + b - x;
    //set存储,自动排序加去重
    set<int> s;
    //A发球x次
    for (int i = 0; i <= a; i ++ )
    {
        if (a - i <= y && i <= x)
            s.insert(x - i + a - i);
    }
    //A发球y次,可以看作B发球x次
    for (int i = 0; i <= b; i ++ )
    {
        if (b - i <= y && i <= x)
            s.insert(x - i + b - i);
    }

    printf("%d\n", s.size());
    for (auto i : s)
        printf("%d ", i);
    printf("\n");
}

C. Deep Down Below

题意:

一个英雄进入n个洞穴,第i个洞穴有ki个怪兽,每个怪兽都有一定的护甲值,当且仅当英雄的攻击力严格大于怪兽的护甲时才能击败怪兽。英雄进入洞穴后按照顺序击败怪兽,每击败一个怪兽攻击力+1,问英雄击败所有洞穴的怪兽所需的最小攻击力

题解:

当英雄进入洞穴时攻击力为x,该洞穴内第i个怪兽护甲值为ai(0 < i < k)那么对于第i个怪兽要满足x + i > ai才可以,那么进入洞穴前的攻击力就要满足x > ai - i

所以对于进入每一个洞穴我们都要找到一个满足x > ai - i的初始最小攻击力即max(ai - i)

我们肯定要先从初始攻击力最小的洞穴进,这样才能保证进入后续洞穴时初始攻击力尽可能的大且英雄所需攻击力最小,所以对进入所有洞穴的初始最小攻击力进行排序即可

代码如下:

//pair数组,first为英雄攻击力,second为每个洞穴可以增加的攻击力
PII a[N];
int n;

void solve()
{
    scanf("%d", &n);
    for (int i = 0; i < n; i ++ )
    {
        int m; scanf("%d", &m);
        int mx = 0;
        for (int j = 0; j < m; j ++ )
        {
            int x; scanf("%d", &x);
            mx = max(mx, x - j);
        }
        a[i] = {mx, m};
    }

    sort(a, a + n);

    int ans = 0, pow = 0;
	//ans为初始英雄最小攻击力,pow为增加的攻击力
    for (int i = 0; i < n; i ++ )
    {
        if (ans + pow < a[i].first) ans = a[i].first - pow;
        pow += a[i].second;
    }
	//这里要+1,因为要严格大于
    printf("%d\n", ans + 1);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值