CUG算法题:魔法操作 深藏的剪枝!

游戏开发中常用的算法1(20道题一篇文章) 游戏开发算法 阅读详情
AI摘要

文章讲述了小明和小亮玩石子游戏的数学问题,通过深度优先搜索(DFS)策略解决,在遇到指数级复杂度时引入剪枝和状态压缩优化算法,降低了计算复杂度,提高了效率。文章强调了在特定情况下,如何识别并消除重复计算,以提高算法性能。

题目

【问题描述】

小明和小亮在玩一个石子游戏。

刚开始,小明有n堆石子,小亮有m堆石子。且两人每一堆石子所包含的石子个数均不超过6。

现在,小明需要执行d次魔法操作。每次魔法操作会从当前还剩余的几堆石子中随机选择一堆(选择每一堆的概率相同),并从这一堆中去掉一个石子。

如果某一堆经过一次魔法操作后不再有任何石子,那么在下次魔法操作执行时则不会再考虑这一堆。

现在小明想知道,在经过d次魔法操作之后,小亮一堆石子都不剩的概率是多少?

【输入形式】

输入的第一行包含三个整数n,m和d(1 ≤ n, m ≤ 5; 1 ≤ d ≤ 100)。

接下来一行包含n个整数,表示小明每堆石子的初始石子数。

第三行包含m个整数,表示小亮每堆石子的初始石子数。所有石子数都在1到6之间(包括1和6)。

【输出形式】

输出经过d次魔法操作后,小亮一堆石子都不剩的概率。结果保留四位小数。

【样例输入1】

1 2 2 2 1 1

【样例输出1】

0.3333

【样例输入2】

5 5 15 2 2 2 2 3 2 3 3 2 2

【样例输出2】

0.0014

分析

针对这道题,首先想到的可能就是直接DFS,进行深搜,尝试找出所有的情况,算出每一种情况的概率没然后求和。函数设计如下:int cur即现在正在进行第cur次操作,double r即向下传递当前节点情况发生的概率;子节点获取父节点的概率之后,再求出当前子节点的概率。当前节点的概率就等于父亲的概率除以当前节点的兄弟个数,而当前节点的的兄弟个数就等于当前还剩下的非空堆数。

这是理论上可行的做法,但实际上这样的方法是指数级复杂度,经过尝试,大约在d=12左右时就已经没法算出结果了。

用DFS实现这一初步的想法如下:(虽然时间复杂度太高)

#include<iostream>
#include<iomanip>
#include<vector>
using namespace std;
const int MAXN = 10;
int a[MAXN] = { 0 };  //明
int b[MAXN] = { 0 };  //亮
int cnt_a, cnt_b; //明和亮总石头数
int n, m;   //明:n,亮:m
int d;
vector<double>Vr;
int n_sibling;

void dfs(int cur, double r) {
    //新的概率等于上一代的概率处于这一代的兄弟个数,这一代的兄弟个数就等于当前还剩下的非空堆数
    double new_r = r * 1.0 / n_sibling;

    if (cnt_b == 0) {
        Vr.push_back(r);
        return;
    }
    //两个特判
    if (d - (cur - 1) >= cnt_a + cnt_b) {
        Vr.push_back(r);
        return;
    }
    if (d - (cur - 1) < cnt_b) {
        return;
    }
    //另一种递归出口
    if (cur > d && cnt_b != 0) {
        return;
    }

    for (int i = 1; i <= n; i++) {
        if (a[i] > 0) {
            a[i]--;
            cnt_a--;
            if (a[i] == 0) n_sibling--;
            dfs(cur + 1, new_r);
            if (a[i] == 0) n_sibling++;
            a[i]++;
            cnt_a++;

        }

    }

    for (int i = 1; i <= m; i++) {
        if (b[i] > 0) {
            b[i]--;
            cnt_b--;
            if (b[i] == 0) n_sibling--;
            dfs(cur + 1, new_r);
            if (b[i] == 0) n_sibling++;
            b[i]++;
            cnt_b++;

        }
    }

}


int main() {
    double ans = 0;
    cin >> n >> m >> d;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        cnt_a += a[i];
    }
    for (int i = 1; i <= m; i++)
    {
        cin >> b[i];
        cnt_b += b[i];
    }

    if (d > cnt_b + cnt_a) {
        ans = 1;
        cout.setf(ios::fixed);
        cout << setprecision(4) << ans << endl;
        return 0;
    }

    if (d < cnt_b) {
        ans = 0;
        cout.setf(ios::fixed);
        cout << setprecision(4) << ans << endl;
        return 0;
    }
    n_sibling = n + m;

    dfs(1, 1.0);

    for (int i = 0; i < Vr.size(); i++) {
        ans += Vr[i];
    }


    cout.setf(ios::fixed);
    cout << setprecision(4) << ans << endl;

}

一般利用剪枝法可以简化DFS的计算,但想来想去,似乎这一题不具备普遍的可以剪枝的情况,可以剪掉的一些情况过于稀少,对整体复杂度其实没有什么影响。那DFS真的就不行吗?

算法思路

其实这一题巧就巧在隐藏了一种非常普遍的重复情况,如果发现了就可以剪掉绝大多数的计算。下面介绍这种普遍的重复情况。

设小明,小亮一开始分别为1堆,2堆,石子数分别为2 | 2,1。d=3.那么我们开始进行操作。

有一部分节点没有往下画,可以不用管。关注图中标红的三个框,思考它们是不是同一种情况呢?我们用字符串来表示一个节点,用逗号分割小明和小亮的石子,对于同一个人的石头堆,我们不关心先后顺序,那么这三个情况都可以表示成:"2,01"。然后用哈希表将这些状态和一个概率值对应起来。在后面的代码中,我借鉴了桶排序的思想来存储节点状态,也就是给小明和小亮各设置7个状态位表示0-6个石子,例如str[3]=5即表示石子个数为3的堆有5个。为什么选择桶排序的思想呢,因为这样在生成字符串时,不用对每个人的各堆进行排序,减小了时间复杂度。根据这种方式,那么图中红框的三个情况可以表示为字符串"0010000,1100000"。但是为了直观理解,在解释原理的时候还是采用"2,01"这种表示方式。

那么我们尝试把“2,01”的情况归一:无论从根节点怎样一步一步选择到达“2,10”节点,对于三种“2,01”节点,它们之下的节点一定是相同的,即都是“1,01”和“2,00”。也就是不管出现“2,01”的概率为多少,在“2,01”已经出现的条件下,它的所有子节点的概率都可以归为同一个“2,01”的子节点概率。那么我们就找到了这三个“2,01”的共性,它们终于可以被统一成一种情况了。我们直接把“2,01”与概率1/2对应起来,也就是“2,01”的子节点们中能够出现小亮全为零的情况概率之和。

类似地,我们将“2,11”与概率1/3对应起来。怎么算的呢?也就是对于其子节点(1|21)->0, (2|01)->1/2,(2|10)->1/2,计算概率:(0+1/2+1/2)/3,这里的3就是"2,11"的子节点个数。

可以这么理解:每一个节点有两个任务:一是从它的所有子节点收到子节点的概率,将它们加和,存储为自己的概率值p(生成哈希表);二是把p除以自己兄弟节点的个数并进行回传,也就是p/n_sibling即函数的返回值(回传概率)。通过这种方式,每遍历树的一支,就可以为哈希表添加很多记录。在每次进入新节点时,先从哈希表中寻找有无这个节点的记录,如果有则直接用哈希表中的概率而无需继续向下深搜。这样也就可以剪掉很多“枝”了。

以上是基本原理。代码上还有不少实现时的细节,非常易错。代码如下:

#include<iostream>
#include<iomanip>
#include<unordered_map>
#include<string.h>
using namespace std;

const int MAXN = 10;
int a[MAXN] = { 0 };  //明
int b[MAXN] = { 0 };  //亮
int cnt_a, cnt_b; //明和亮总石头数
int n, m;   //明:n,亮:m
int d;
unordered_map<string, double> map;  //哈希表

//生成状态压缩字符串
string getList(int seta[], int setb[]) {


    string tmp = "000000000000000";
    for (int i = 0; i <= 6; i++) {
        char ch1 = seta[i] + 48;
        char ch2 = setb[i] + 48;
        tmp[i] = ch1;
        tmp[i + 8] = ch2;
    }
    tmp[7] = ',';
    return tmp;
}


double dfs(int cur, int this_sibling) {
//记录概率:子树概率之和
//回传概率:子树概率之和/本层兄弟结点个数

    int next_sib = 0;
    //获得状态压缩字符串,并计算子树个数next_sib:
    int set_a[7] = { 0 };
    int set_b[7] = { 0 };
    for (int i = 1; i <= n; i++) {
        set_a[a[i]]++;
        if (a[i] != 0)next_sib++;

    }
    for (int i = 1; i <= m; i++) {
        set_b[b[i]]++;
        if (b[i] != 0)next_sib++;
    }
    string cur_str = getList(set_a, set_b);

    //利用哈希表的记录剪枝:
    bool flag = map.count(cur_str);
    if (flag) {
        double rate = map.at(cur_str);
        return rate/this_sibling;
    }
    //递归出口1:找到满足要求的叶子结点
    if (cnt_b == 0) {
        
        string tmp = cur_str;
        return 1.0/this_sibling;
        
    }
    //特判剪枝
    if (d - cur >= cnt_a + cnt_b) {
        
        string tmp = cur_str;
        return 1.0/this_sibling;
    }
    
    //递归出口2:未找到满足要求的叶子结点
    if (cur == d && cnt_b != 0) {
        string tmp = cur_str;
        return 0;
    }
    
    //dfs部分:遍历各堆,进入各个子树
    double rate = 0;
    for (int i = 1; i <= n; i++) {

        if (a[i] > 0) {
            a[i]--;
            cnt_a--;
            rate += dfs(cur + 1, next_sib);
            a[i]++;
            cnt_a++;

        }

    }
    for (int i = 1; i <= m; i++) {

        if (b[i] > 0) {
            b[i]--;
            cnt_b--;
            rate += dfs(cur + 1,next_sib);
            b[i]++;
            cnt_b++;

        }
    }
    //记录概率、回传概率
    map.insert({ cur_str,rate });
    return rate*1.0/this_sibling;
}


int main() {
    double ans = 0;
    cin >> n >> m >> d;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        cnt_a += a[i];
    }
    for (int i = 1; i <= m; i++)
    {
        cin >> b[i];
        cnt_b += b[i];
    }
    if (d > cnt_b + cnt_a) {
        ans = 1;
        cout.setf(ios::fixed);
        cout << setprecision(4) << ans << endl;
        return 0;
    }

    if (d < cnt_b) {
        ans = 0;
        cout.setf(ios::fixed);
        cout << setprecision(4) << ans << endl;
        return 0;
    }

    ans=dfs(0, 1);

    cout.setf(ios::fixed);
    cout << setprecision(4) << ans << endl;
    return 0;

}

总结

总的来说,这道题的难度对我这个菜鸡来说太高!反复推倒重来+打磨代码经过了三天,头发想必掉了不少,呜呜。

有人觉得DP可能也可以做出来,但我尝试了很多次也没能构建出合适的递推数组和状态转移方程。我觉得可能还是DFS+剪枝才是这道题的解法吧。但是这题的剪枝真的非常独特,现在再想起来也觉得很有意思,特此写一篇blog记录一下。

Unity游戏开发客户端面经——算法(初级) Unity游戏开发客户端面经之算法篇 阅读详情

相关推荐

[面经]阿里游戏一面的算法题

前言:两天前参加阿里游戏的面试,一面时出了一道面试题。那时我看楞了,好像没做过这种题型,看起来很容易又很难。很容易是,使用O(N^2)就可以解决,难得是,优化时间复杂度。 题目:字符串删除字符(字符可能会有重复,要一起删掉) 思路一(反正面试我没这么写,你们随便看看) 一开始看到题目,思路就遍历字符串,一个个字符比较,然后删除它。 (1) 遍历数组,找到目标字符;

KesarChen的博客 6284

ACM PKU POJ 1740 解题报告 -- 男人八题之四

<br />题目链接:http://poj.org/problem?id=1740<br />题意:小明和小红参加一种新的取石子游戏。游戏开始时有 n 堆石子,参与游戏的两个选手轮流取走和移动石子,游戏从小明开始。在每一轮中,选手选择一个至少有一颗石子的堆,从该堆石子中拿走至少一个石子。接着,该选手可以多次地从该堆中剩下的石子中把任意多的个石子移动到任意的堆中。当然,该选手也可以不移动任何石子。但是,必须注意,选手必须从该选中的堆中取起至少一块石子。因此,随着游戏的进行,石子越来越少。当轮到某选手时,已经没

夜鱼的专栏 1763

雷达信号处理DDC数字下变频

由于接收到的雷达信号频率较高,不能对其进行直接采样并数据处理,所以需要对雷达信号进行预处理,在降低其采样率的同时,将其由中频降低到低频,然后对输出的基带信号进行后续的解析,以便于获取雷达信号的特征参数。 本文采用数字正交下变频,将单通道信号转化为正交双通道信号,数字下变频(DDC)的原型为模拟下变频,通过对窄带雷达信号或单频信号进行数字混频,然后对信号进行正交采样,提取 I、Q 两路正交分量,最后通过滤波去除信号中的高频分量,将信号由中高频搬移至低频。 模拟下变频的系统框图如下: 其数学推导.

qq_44033461的博客 5228

常见的几种博弈综合

最经典的Nim博弈: 描述: 一共有N堆石子,编号 1~n ,第 i 堆中有个 ai 个石子。每一次操作Alice和Bob可以从任意一堆石子中取出任意数量的石子,至少取一颗,至多取出这一堆剩下的所有石子。两个人轮流行动,取走最后一个的人胜利。 结论:对某个人来说都有一个局面,当且仅当 a1 ^ a2 ^ …… ^ an = 0时,必败,否则必胜。 反Nim博弈: 描述: 与经典Nim博弈相反,取走......

xiaobian_的博客 1683

从理论到实践:基于Zemax的高分辨率生物显微镜光学系统仿真与优化指南

本文详细介绍了基于Zemax的高分辨率生物显微镜光学系统仿真与优化全流程。从阿贝分辨率公式、柯勒照明等理论基础出发,逐步讲解Zemax建模、像差优化、制造可行性分析等核心步骤,并提供常见问题解决方案。通过实际案例展示如何将理论设计转化为可制造的优化方案,帮助工程师掌握从仿真到实际应用的关键技术。

weixin_29229989的博客 481

让 AI 学会“慢思考”:MCP Sequential Thinking 深度部署与使用指南

摘要: MCP Sequential Thinking 是一种让AI具备"慢思考"能力的技术,通过动态调整思维路径解决复杂问题。本文详细介绍了在Windows、macOS和Linux系统下的部署方法,包括环境准备、配置文件修改等步骤。该技术通过"产生想法-评估需求-修正路径"的循环机制,显著提升AI在代码设计、数学证明等复杂任务中的表现。文章还提供了验证安装方法、使用示例和常见问题解答,帮助开发者解锁AI的深层思考能力。(149字)

weixin_43236925的博客 1907

米哈游测试开发笔试算法题(2020-9-19)

​1.旋转字符游戏:给定两个整数M,N,生成一个M*N的矩阵,矩阵中元素取值为A-Z的26个字母中的一个,A在左上角,其余各数按顺时针方向旋转前进,依次递增放置,当超过Z时,又从A开始填充。 ​...

H_Greddy的博客 2959

别再凭感觉选电容了!手把手教你计算电机控制器里的母线电容(附Excel计算工具)

本文详细解析了电机控制器中母线电容的选型方法,从理论计算到工程实践,帮助工程师避免常见误区。通过精确计算纹波电压、电容容量等关键参数,并结合薄膜电容与电解电容的性能对比,提供实用的选型建议。附带的Excel计算工具可快速完成参数计算,适用于工业伺服驱动和电动车电机控制器设计。

weixin_28720573的博客 518

石子-2020牛客NOIP赛前集训营-普及组(第四场)

https://ac.nowcoder.com/acm/contest/7610/B 博弈论 题目 Alice 和 Bob 从小就一起玩石子。 有一天,他们又想愉快的玩一个石子游戏。 一共有 n 堆石子,第 i 堆石子有 ai个,两人轮流操作。 Alice 走先手,每个人每个回合只能对一堆石子进行操作,Alice 每次操作只能拿偶数个石子,Bob 每次操作只能拿奇数个石子, 每次操作至少拿走一个石子,直到一方无法进行任何操作,无法操作的人失败。 假设Alice与Bob都是绝顶聪明的,如果 Alice 可以获

qq_43680250的博客 323

迈创cameralink采集卡安装操作说明

迈创cameralink采集卡安装操作说明MIL软件安装MIL软件下载获取MIL软件安装MIL软件安装常见问题 MIL软件安装 MIL软件下载获取 MIL软件安装 解压MIL安装包,点击MilSetup.exe开始安装,如下图所示; 备注:64位系统MIL软件可以同时安装32位和64位客户端,本文档默认安装64位客户端,64位系统安装32位MIL方法后续再展开讲(不建议这样用,很麻烦) 点击Launch Installation开始安装,64位系统,默认只安装64位MIL客户端 根据采集卡驱动,选择M

qq_23107577的博客 9348

U型槽微带贴片天线:从理论公式到带宽扩展实战

本文深入探讨了U型槽微带贴片天线的设计与带宽扩展实战。针对传统微带天线带宽窄的痛点,详细解析了通过引入U型槽形成双谐振点以拓宽带宽的原理,并提供了从MATLAB理论计算、ANSYS HFSS仿真建模到参数优化的一站式工程指南。文章还分享了多种带宽扩展组合技巧及仿真与实测避坑经验,助力射频工程师设计出高性能的宽带微带天线。

weixin_29168153的博客 447

(P42-P43)魔法方法:算数运算符的魔法方法,反运算相关的魔法方法,增量赋值运算 ,一元操作符

文章目录1.算数运算符的魔法方法2.反运算相关的魔法方法3.增量赋值运算4.一元操作符 1.算数运算符的魔法方法 python2.2以后,对类和类型进行了统一,做法就是讲int()、float()、str()、list()、tuple()这些BIF转换为工厂函数(类对象) 给出以下算数运算符对应的魔法方法,前面和后面都被双下划线包尾说明是魔法方法 运算符 对应的魔法方法 中文注释 + __ add__(self, other) 加法 - __ sub__(self, oth

喜欢打篮球的普通人 508

matlab 三维绘图 抛光,瓷砖抛光过程建模与仿真

:瓷砖抛 光过程 建模与仿真朱 成 就(广 东工业大学 机 电工程 学院, 广东广州 )摘要 :瓷砖的抛磨影响 因素众 多 ,实际磨削加工时容易出现漏抛 、返抛现象 。对陶瓷抛光机磨头进行运动学分析 ,并基于不 同粒度号 的磨 粒在一定压力下的加工深度模型 ,探讨抛光机磨 头转 速 、横梁摆动频率 、传送速度对瓷砖抛光加工表 面均匀性 的影响,然 后结合 磨削机理使 用 对陶瓷抛光过程进行仿真 ...

weixin_36331058的博客 747

题解:取石子游戏(博弈)

题目描述 一天小明和小红在玩取石子游戏,游戏规则是这样的: (1)本游戏是一个二人游戏; (2)有一堆石子,共有n个; (3)两人轮流进行; (4)每走一步可以取走1~m个石子; (5)最先取光石子的一方为胜。 如果游戏的双方使用的都是最优策略,请输出哪个人能赢。 输入输入的第一行是一个正整数C(C<=100),表示有C组测试数据。 每组输入两个整数n和m(1<=n,m<=100...

晚安( ̄o ̄) . z Z 4993

高云FPGA系列教程(1):FPGA和ARM开发环境搭建

至此,高云FPGA和MCU开发环境就搭建完成了,整体还是比较简单的,几乎是一键完成,下一篇文章我们进行实际的FPGA和MCU开发。本文是高云FPGA系列教程的第1篇文章。

whik1194的博客 6186

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

取石子游戏

题目描述 一天小明和小红在玩取石子游戏,游戏规则是这样的: (1)本游戏是一个二人游戏; (2)有一堆石子,共有n个; (3)两人轮流进行; (4)每走一步可以取走1~m个石子; (5)最先取光石子的一方为胜。 如果游戏的双方使用的都是最优策略,请输出哪个人能赢。 输入 输入的第一行是一个正整数C(C<=100),表示有C组测试数据。 每组输入两个整数n和m(1<=n,m<...

weixin_34221276的博客 475

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

2021-12-03:石子游戏 IV。Alice 和 Bob 两个人轮流玩一个游戏,Alice 先手。 一开始,有 n 个石子堆在一起。每个人轮流操作,正在操作的玩家可以从石子堆里拿走 任意 非零 平

2021-12-03:石子游戏 IV。Alice 和 Bob 两个人轮流玩一个游戏,Alice 先手。 一开始,有 n 个石子堆在一起。每个人轮流操作,正在操作的玩家可以从石子堆里拿走 任意 非零 平方数 个石子。 如果石子堆里没有石子了,则无法操作的玩家输掉游戏。 给你正整数 n ,且已知两个人都采取最优策略。如果 Alice 会赢得比赛,那么返回 True ,否则返回 False 。 来自力扣1510。 来自哈喽单车。 答案2021-12-03: 动态规划。 时间复杂度:O(N*sqrt(N))。 额外

福大大架构师每日一题 2万+

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

动态规划学习-Leetcode-877题石子游戏

亚历克斯和李用几堆石子在做游戏。偶数堆石子排成一行,每堆都有正整数颗石子 piles[i] 。 游戏以谁手中的石子最多来决出胜负。石子的总数是奇数,所以没有平局。 亚历克斯和李轮流进行,亚历克斯先开始。 每回合,玩家从行的开始或结束处取走整堆石头。 这种情况一直持续到没有更多的石子堆为止,此时手中石子最多的玩家获胜。 假设亚历克斯和李都发挥出最佳水平,当亚历克斯赢得比赛时返回 true ,当李赢得比赛时返回 false 。 示例: 输入:[5,3,4,5] 输出:true 解释: 亚历克斯先开始,只能拿前.

weixin_44953347的博客 320

Leetcode 动态规划题目记录1

记录一道经典的动态规划题目,题目内容如下: Alice 和 Bob 两个人轮流玩一个游戏,Alice 先手。 一开始,有 n 个石子堆在一起。每个人轮流操作,正在操作的玩家可以从石子堆里拿走 任意 非零 平方数 个石子。 如果石子堆里没有石子了,则无法操作的玩家输掉游戏。 给你正整数 n ,且已知两个人都采取最优策略。如果 Alice 会赢得比赛,那么返回 True ,否则返回 False 。 示例 1: 输入:n = 1 输出:true 解释:Alice 拿走 1 个石子并赢得胜利,因为 Bob 无法进行

z893761325的博客 669

D 取石子游戏

链接:https://ac.nowcoder.com/acm/contest/4743/D 小灰灰和小乔在玩取石子游戏,一堆石子有{n}n个石子,小灰灰和小乔轮流操作,小灰灰先手,每次操作的人可以进行以下操作: 假设当前石子数量为{k}k,如果{k>=2}k>=2,那么将石子分为{f(k)}f(k)和{k-f(k)}k−f(k)两堆,然后选择其中任意一堆石子取走。否...

Luoriliming的博客 443

第四题 取石子(pebble)

【问题描述】两个人玩取石子游戏。最开始有 N 个石子,游戏规则如下:1、 A 先取,B 再取,A 接着取,以此轮流下去; 2、 A 第一次取可以取 1~N 个石子;3、 一个人最少取 1 个,最多取上一轮取的石子数的两倍,当然,剩下 X 个,取 X+1个显然也不行,也就是说不能取超过剩下石子数的个数;4、 取到最后一颗石子的人获胜。在保证 A 获胜的情况下,第一次取的石子数最少是多少。...

ddtjmmuyz952485243的博客 361

字节跳动开发面经

  最近好久没有更新文章了,因为在准备实习,我研究生是用深度学习搞医学图像处理方向的,然后由于是女生的缘故,其实搞算法不太占优势,所以想着去做开发端,但是对开发方向的东西完全不了解,都是本科学的东西了,并且我也没有任何相关的项目,全都是做的研究。但是,我怎么会认输呢,于是我复习了20天!最终字节跳动我还是过了三面技术面,所以想将自己的心得体会写一写,不太有项目或者说简历也没那么相关的想要投字节的小伙伴可以看一下,后续应该会向我朋友要一些关于算法岗的心得。 前期准备   大体说一下我的准备方式吧,其实寒假过.

weixin_43436958的博客 6190

【游戏客户端面试题干货】--2020年最新游戏客户端面试干货(c#篇)

【游戏客户端面试题干货】--2020年度最新游戏客户端面试干货( C#篇 ) 大家好,我是Lampard~~ 经过春招一番艰苦奋战之后,我终于是进入了心仪的公司。 今天给大家分享一下我在之前精心准备的一套面试知识。 今天和大家分享的是C#的面试题 本人亲测80%的引擎相关题目都是围绕着我总结出来的知识点提出的 。 一.结构和类的区别 1.结...

Lampard的博客 1815

深挖C++:类和对象(中)

(先进后出)

xys_678的博客 238

选型笔记:Type‑C 扩展坞方案评估|DP1.4 转 HDMI2.0 桥接芯片 GSV2201S@ACP

本文记录 GSV2201S 这款 DP1.4a 转 HDMI2.0 桥接芯片评估,梳理视频、HDCP、PD 集成能力,总结 Type‑C 转接 Dongle、扩展坞方案的适配边界,以及差分走线、PD 时序、HDCP 握手等高频调试问题,为 C 口视频转接方案选型提供参考。

ACP广源盛的博客 220
下一篇: C++面向过程 期末复习 重点总结
LemonTree 
博客等级 码龄5年 112粉丝 13原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值