蓝桥杯备赛:Day6-B-小紫的劣势博弈 (牛客周赛 Round 85)

📚 算法笔记:B-小紫的劣势博弈 (牛客周赛 Round 85)

1. 题目简述

B-小紫的劣势博弈_牛客周赛 Round 85

  • 初始状态 : x = 0 x = 0 x=0,给定一个长度为 n n n 的正整数数组。
  • 操作规则 :小红(先手)和小紫轮流取走一个数。小红取走 a i a_i ai 则 x + a i x + a_i x+ai,小紫取走 a i a_i ai 则 x − a i x - a_i x−ai。
  • 目标函数 :小红希望最终 x x x 最小 ,小紫希望最终 x x x 最大
  • 求解 :双方均采取最优策略时,最终 x x x 的值。

2. 核心代码 (C++ 实现)

c++ 复制代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

// 建议将 sum 放在 solve 内部或每次手动清零,以应对多组数据
ll sum = 0; 

void solve()
{
    ll cnt;
    if (!(cin >> cnt)) return;

    // 关键:在读入 cnt 之后再定义 vector 的大小
    vector<ll> a(cnt);
    for (int i = 0; i < cnt; i++)
    {
        cin >> a[i];
    }
    
    // 1. 核心策略:排序。因为双方都想保护大数不被对方操作,所以都会抢夺当前最小的数
    sort(a.begin(), a.end());
    
    sum = 0; // 初始化累加器
    for(int i = 0; i < cnt; i++)
    {
        // 2. 模拟博弈过程
        if(i % 2 == 0)
        {
            sum += a[i]; // 第 1, 3, 5... 次操作由先手小红执行
        }
        else
        {
            sum -= a[i]; // 第 2, 4, 6... 次操作由后手小紫执行
        }
    }
    
    cout << sum << endl;
}

int main()
{
    // 提高 IO 效率
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    
    int _ = 1;
    // cin >> _; // 若题目存在多组数据测试,取消此行注释
    while(_--)
    {
        solve();
    }
    return 0;
}

3. 核心考点与注意事项

  • 贪心博弈转化
    • 小红要加数,但希望结果小 → \rightarrow → 她会优先消耗数组中最小的数。
    • 小紫要减数,但希望结果大 → \rightarrow → 为了减得少,她也会优先消耗数组中最小的数。
    • 结论 :双方的目标虽然相反,但行为达成了一致------按升序依次取数
  • 数值范围 : n = 10 5 n=10^5 n=105 且 a i = 10 9 a_i=10^9 ai=109,累加和 sum 必须使用 long long
  • 排序效率 :使用 std::sort,时间复杂度为 O ( n log ⁡ n ) O(n \log n) O(nlogn),足以通过 10 5 10^5 105 级别的数据。

4. 易错点回顾 (My Mistakes)

1. 全局 Vector 的初始化陷阱

  • 错误经历 :曾尝试在全局定义 vector<ll> a(cnt)
  • 后果 :由于程序启动时全局变量 cnt 默认为 0,会导致 vector 初始化大小为 0。即使后续在 solve 函数中给 cnt 赋值,vector 也不会自动扩容,导致访问越界。
  • 修正 :必须在读入 cnt 之后,使用 vector<ll> a(cnt) 局部定义或 a.resize(cnt)

2. 全局变量的残留问题

  • 错误经历 :将 sum 定义为全局变量且未在 solve 开始时清零。
  • 后果 :如果题目给出的测试数据组数 _ > 1,第二次计算的结果会叠加上一次的残余值。
  • 修正局部变量优先原则 。能写在 solve 里的变量尽量不要写在外面。
相关推荐
Darkwanderor14 分钟前
多线程的互斥问题和互斥锁解决互斥问题
linux·c语言·c++
键盘会跳舞15 分钟前
C++:std::pair 源码级深度剖析 —— 关联容器的基石
开发语言·c++·pair·关联容器
(Charon)18 分钟前
【C++】手写线程安全队列:mutex + condition_variable 实现生产者消费者模型
c语言·开发语言·c++
·薯条大王9 小时前
经济实惠玩云服务器|一台云服务器多人共用,子账号配置教程
java·linux·运维·服务器·汇编·c++·python
hansang_IR14 小时前
【题解】LC:倍增 / 区间并查集(Range Parallel Unionfind)
c++·算法·并查集
东东最爱敲键盘14 小时前
day7.c++继承
c++
沫璃染墨15 小时前
《从零入门Linux系统篇(十五):系统工具篇·六——GDB调试器详解:从程序执行控制到高级调试技巧》
linux·运维·服务器·c语言·c++
吃着火锅x唱着歌15 小时前
Effective C++ 学习笔记 条款40 明智而审慎地使用多重继承
c++·笔记·学习
醉城夜风~16 小时前
(超详细)C++ STL list容器详解:从使用方法到双向链表底层原理全面解析
c++·windows
烟花落o16 小时前
C++ 从 C 到进阶 ②:引用、inline 、nullptr
c++·引用·inline·nullptr·c++入门