出处不详 取数游戏

news2024/9/25 17:10:59

目录

  • 取数游戏
    • 题目描述
      • 背景
      • 输入
      • 输出
      • 数据范围
    • 题解
      • 解法
      • 优化
    • 打赏

取数游戏

题目描述

背景

两人将 n n n个正整数围成一个圆环,规则如下:

  1. 第一名玩家随意选取数字;
  2. 第二名玩家从与第一名玩家相邻的两个数字中选择一个;
  3. 而后依次在到目前为止所取的任何数字旁边取一个数字,直到数字用完,选择更多奇数的玩家获胜
    第一个选取数字的玩家想知道他能做出多少不同的第一步,使他有机会获胜

输入

  1. 第一行一个整数 n n n
  2. 第二行 n n n个整数 n u m i num_i numi,表示围在地上的数字

输出

输出一个整数,表示有机会获胜的不同的第一步的数量

数据范围

1 ≤ n ≤ 100 , 1 ≤ n u m i ≤ 1000 1 \le n \le 100 , 1 \le num_i \le 1000 1n100,1numi1000

题解

解法

由于要算的是有机会获胜的不同第一步的数量,所以对于每个可能的第一步,只要后续所有选择情况中,第一名玩家获得最多奇数的那一种情况下超过了第二名玩家即可
为此可以定义一个二维数组 f [ ] [ ] f[][] f[][] f [ i ] [ j ] f[i][j] f[i][j]表示在第 i i i j j j个数已经被选择后( i i i可以大于 j j j),直到所有数都被选择,该过程中第一名得到的奇数最多可超出第二名多少
使用动态规划来更新这个数组,先由大到小枚举已经被选的数的数量 i ( n − 1 ≥ i ≥ 1 ) i(n - 1 \ge i \ge 1) i(n1i1),再枚举被选数的区间,定义变量 l , r l , r l,r表示枚举到的区间的左右边界下标,变量 l l , r r ll , rr ll,rr分别表示表示圆环中 l l l的前一个数和 r r r的后一个数,再根据 i + 1 i + 1 i+1的奇偶判断接下来是第一名还是第二名玩家选数,这样就得到了状态转移方程: f [ l ] [ r ] = m a x ( f [ l l ] [ r ] ± n u m [ l l ] % 2 , f [ l ] [ r r ] ± n u m [ r r ] % 2 ) f[l][r] = max(f[ll][r] \pm num[ll] \% 2 , f[l][rr] \pm num[rr] \% 2) f[l][r]=max(f[ll][r]±num[ll]%2,f[l][rr]±num[rr]%2) i + 1 i + 1 i+1为奇时取 + + +,反之取 − -
全部更新完后,统计满足 f [ i ] [ i ] + n u m [ i ] % 2 > 0 f[i][i] + num[i] \% 2 > 0 f[i][i]+num[i]%2>0(因为第一个数一定是第一名玩家选的)的 i i i有几个即可
代码如下:

#include<cstdio>

#define il inline

const int M = 105;

int f[M][M], num[M];

int main() {
    int n, ans = 0;
    scanf("%d%", &n);
    for(int i = 1; i <= n; ++i) scanf("%d%", &num[i]);
    for(int i = n - 1; i >= 1; --i) {
        if(i % 2 ^ 1)     //等于(i + 1)%2
            for(int l = 1, r = i; l <= n; ++l) {
                int ll = l - 1 ? l - 1 : n, rr = r + 1 <= n ? r + 1 : 1;
                int s1 = f[ll][r] + num[ll] % 2, s2 = f[l][rr] + num[rr] % 2;
                f[l][r] = s1 > s2 ? s1 : s2, r = rr;
            }
        else for(int l = 1, r = i; l <= n; ++l) {
                int ll = l - 1 ? l - 1 : n, rr = r + 1 <= n ? r + 1 : 1;
                int s1 = f[ll][r] - num[ll] % 2, s2 = f[l][rr] - num[rr] % 2;
                f[l][r] = s1 < s2 ? s1 : s2, r = rr;
            }
    }
    for(int i = 1; i <= n; ++i) ans += num[i] % 2 + f[i][i] > 0;
    printf("%d", ans);
    return 0;
}

优化

可以发现全程只用到了 n u m [ i ] num[i] num[i]的奇偶性,所以可以在输入时就把 n u m [ i ] num[i] num[i]处理成 0 0 0 1 1 1,这样 n u m [ ] num[] num[]只需要为 b o o l bool bool数组
代码如下:

#include<cstdio>

#define il inline

const int M = 105;

il int read() {
    int x = 0;
    char c = getchar();
    while(c < '0' || c > '9') c = getchar();
    while(c >= '0' && c <= '9') x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();
    return x;
}

bool num[M];
int f[M][M];

int main() {
    int n = read(), ans = 0;
    for(int i = 1; i <= n; ++i) num[i] = read() % 2;
    for(int i = n - 1; i >= 1; --i) {
        if(i % 2 ^ 1)
            for(int l = 1, r = i; l <= n; ++l) {
                int ll = l - 1 ? l - 1 : n, rr = r + 1 <= n ? r + 1 : 1;
                int s1 = f[ll][r] + num[ll], s2 = f[l][rr] + num[rr];
                f[l][r] = s1 > s2 ? s1 : s2, r = rr;
            }
        else for(int l = 1, r = i; l <= n; ++l) {
                int ll = l - 1 ? l - 1 : n, rr = r + 1 <= n ? r + 1 : 1;
                int s1 = f[ll][r] - num[ll], s2 = f[l][rr] - num[rr];
                f[l][r] = s1 < s2 ? s1 : s2, r = rr;
            }
    }
    for(int i = 1; i <= n; ++i) ans += num[i] + f[i][i] > 0;
    printf("%d", ans);
    return 0;
}

打赏

制作不易,若有帮助,欢迎打赏!
赞赏码

支付宝付款码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2126100.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MOM成功实施分享(五)刨花板制造数字化聚焦业务场景

刨花板是一种人造板材&#xff0c;由木材或其他植物纤维原料制成。 在制造生产过程中目前存在以下痛点&#xff1a; 原材料质量不稳定&#xff1a;刨花板的质量很大程度上取决于原材料的质量&#xff0c;如果原材料的来源不稳定、质量参差不齐&#xff0c;会影响刨花板的性能…

从线段中搜寻提取闭合轮廓(三)

1.前言 做底层和数据的调试问题也是个麻烦事&#xff0c;如果没有方便的可视化工具辅助&#xff0c;那将令人感到痛苦&#xff0c;借助可视化的工具可以让我们高效、省心&#xff0c;进而心情舒畅&#xff0c;重要的是可以提高调试效率。 当然可视化工具也分不同层次的…

我对 monorepo 的一些思考

我对 monorepo 的一些思考 我对 monorepo 的一些思考 前言它的由来技术选型 管理工具语言与打包调试工具测试框架代码规范与质量控制本地引用与发包替换发包流程Github 相关配置部署 使用手册 功能特性总结如何使用&#xff1f;清除默认的包(可选)模板包介绍 packagesapps 更新…

25虾皮笔试shopee笔试测评sea笔试测评题型

虾皮笔试shopee笔试测评用的自己的笔试系统&#xff0c;全英文笔试&#xff1a; 1.Numerical Reasoning Test&#xff1a;10题&#xff0c;言语推断和数学计算 2. Verbal Reasoning Test&#xff1a;10题&#xff0c;言语理解&#xff0c;每题一段英文材料&#xff0c;选对错…

医院管理|基于java的医院管理系统小程序(源码+数据库+文档)

医院管理系统小程序 目录 基于java的医院管理系统小程序 一、前言 二、系统设计 三、系统功能设计 医生信息管理 排班信息管理 科室信息管理 科室预约 病历信息 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a;…

浅谈模型在信贷营销中的应用

浅谈模型在信贷营销中的应用 当前在信贷营销场景中,用户流量竞争愈加激烈,获客成本持续攀高,客户消费观念和消费信心趋向保守,传统的信贷营销方式效果逐渐乏力,借助数据挖掘技术对用户进行多元优化及精细化管理已经成为企业在经营发展中的普遍趋势。在此背景下,本文将围…

如何设置新建每个Python文件开头带上作者名和时间?

1、在pycharm界面中点击"File->Settings" 2、点击"Editor->File and Code Templates->Python Script" 3、添加信息后&#xff0c;点击"ok" # encoding: utf-8 # File : ${NAME}.py # Author: jianlu # Date : ${YEAR}/${MONTH}/${DA…

LBS 开发微课堂|轨迹重合率分析API升级:距离无上限,操作更简便

为了让广大的开发者 更深入地了解 百度地图开放平台的 技术能力 轻松掌握满满的 技术干货 更加简单地接入 位置服务 我们特别推出了 “位置服务&#xff08;LBS&#xff09;开发微课堂” 系列技术案例 第二期的主题是 《轨迹重合率分析API升级》 百度地图的鹰眼轨迹…

算法设计(一)

1.汉诺塔 介绍 汉诺塔&#xff08;Hanoi Tower&#xff09;:它描述了如何将一堆大小不同、穿在一根柱子上的盘子移动到另一根柱子上&#xff0c;同时满足以下规则&#xff1a; 每次只能移动一个盘子。 每个移动盘子时&#xff0c;大的盘子不能放在小的盘子上面。 可以使用一根…

若依RuoYi项目环境搭建教程(RuoYi-Vue + RuoYi-Vue3版本)

文章目录 一、开发脚手架选择二、RuoYi框架1、介绍2、版本发展3、为什么选择若依4、优缺点5、项目内置功能 三、后端项目部署1、拉取源码2、环境要求3、Maven构建4、MySQL相关&#xff08;1&#xff09;导入SQL脚本&#xff08;2&#xff09;配置信息 5、Redis相关&#xff08;…

crdownload格式后缀的文件是什么东西?crdownload格式是什么

crdownload格式就是浏览器没下载完成的文件&#xff0c;如果下载完成了&#xff0c;那么就显示正常的格式和文件名了。

ARM32开发——DMA

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 基础概念CPURAM外设 ARM32程序存储 执行过程取数据 执行操作流程总结 基础概念 CPU CPU&#xff08;Central Processing Unit&am…

[点云处理] cloud compare二次插件功能开发(三)CC插件总结与加速开发

本文完成一个点云变换的插件&#xff0c;同时也是对CC接口的使用做进一步说明&#xff0c;进一步理解CC插件开发流程&#xff0c;利用CC平台和已有代码加快实现定制功能。 这个功能在 cc 已有的功能已经存在&#xff0c;位于 edit->apply_transformation 这里 文件逻辑组织还…

如何让人工智能训练更快

影响人工智能训练时间的因素 在深度学习训练中&#xff0c;训练时间的计算涉及到多个因素&#xff0c;包括 epoch 数、全局 batch size、微 batch size、计算设备数量等。下面是一个基本的公式来说明这些参数之间的关系&#xff08;注意&#xff0c;这只是一个基本的说明公式&…

改变事件

窗口的某些属性的状态发生改变时就会触发该事件 对应的事件类型包括 QEvent::ToolBarChange, QEvent::ActivationChange, QEvent::EnabledChange, QEvent::FontChange,QEvent::StyleChange, QEvent::PaletteChange, QEvent::WindowTitleChange, QEvent::IconTextChange, QEve…

【大模型基础】P2 Bag-of-Words

目录 词袋模型 概述词袋模型 实例第1步 构建语料库第2步 对句子进行分词第3步 创建词汇表第4步 转换词袋表示第5步 计算余弦相似度 词袋模型的局限性 词袋模型 概述 词袋模型&#xff0c;Bag-of-Words&#xff0c;是一种简单的文本表示方法&#xff0c;也是 NLP 中的一个经典模…

【Arcgis基础教程】GIS数据制备,空间分析与高级建模实践应用

随着信息技术的发展,数字地球、智慧地球等新概念的出现&#xff0c;人们对信息的需求日益提高&#xff0c;使得地理信息系统(GIS)在国民经济各个行业中获得了日益广泛的应用。尤其在当今大数据时代&#xff0c;面对海量的空间数据及个性化的地理信息服务&#xff0c;如何高效地…

Outlook如何归档?

文章目录 一&#xff0e; 目的二&#xff0e; 问题详述三&#xff0e; 解决办法1、打开ouutlook文件2、设置存档文件夹3、设置存档文件夹4、选中邮箱点击确定5、如果备份失败的操作方法 四&#xff0e; 注意事项 一&#xff0e; 目的 解决OUTLOOK邮箱爆满造成无法接收邮件的问题…

猫头虎分享:看完百度内部讲话,整理出李彦宏关于大模型的10个判断

&#x1f981; 猫头虎分享&#xff1a;看完百度内部讲话&#xff0c;整理出李彦宏关于大模型的10个判断 &#x1f4e2; 大家好&#xff01;我是猫头虎技术团队的首席写作官。今天为大家带来一篇重量级内容&#xff1a;从百度内部讲话中&#xff0c;整理了李彦宏对大模型的10大…

LIO-SAM如何保存地图

一、找到LIO-SAM配置文件&#xff0c;路径为config/params.yaml&#xff0c;修改以下两项参数&#xff1a; savePCD: true # https://github.com/TixiaoShan/LIO-SAM/issues/3savePCDDirectory: "/home/slam/catkin_ws/src/maps" …