出处不详 取数游戏

目录

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

取数游戏

题目描述

背景

两人将 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 inlineconst 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)%2for(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 inlineconst 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.rhkb.cn/news/448008.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

科技云报到:大模型时代下,向量数据库的野望

科技云报到原创。 自ChatGPT爆火&#xff0c;国内头部平台型公司一拥而上&#xff0c;先后发布AGI或垂类LLM&#xff0c;但鲜有大模型基础设施在数据层面的进化&#xff0c;比如向量数据库。 在此之前&#xff0c;向量数据库经历了几年的沉寂期&#xff0c;现在似乎终于乘着Ch…

python 位运算 笔记

起因&#xff0c; 目的: 位运算&#xff0c;令我头疼的地方。算法题里面也是经常见到。 位运算。 按位或&#xff0c;OR, | , 只要有一个为1&#xff0c; 结果就是1&#xff0c;否则为0按位异或&#xff0c;XOR, ^, 2个数不同&#xff0c;结果为1&#xff0c; 否则为0&#…

一文介绍SQL标准1986~2023的演变

SQL标准1986年制定第一版&#xff0c;到最新的2023版&#xff0c;已经有38年的历史&#xff0c;现在依然是计算机非常活跃的语言&#xff0c;50%的程序员都能掌握SQL&#xff0c;数据分析师也是SQL的主要使用人员之一。 从早期的基本语法&#xff0c;到融合了XML、JSON等复杂数…

【Matlab 六自由度机器人】笛卡尔空间规划和关节空间规划(附MATLAB建模代码)

笛卡尔空间规划和关节空间规划 近期更新前言正文1. 笛卡尔空间规划特点&#xff1a;步骤&#xff1a; 2. 关节空间规划特点&#xff1a;步骤&#xff1a; 3. 两种方法的区别4. MATLAB代码&#xff1a;机械臂避障路径规划问题和解答4.1 关节空间规划方法4.2 笛卡尔空间规划方法4…

Java中关于算数运算符的理解

在Java中基本的算数运算符有五类 加减-乘*在编程语言中乘号一律写为 *除/在Java中两个整数相除结果还是整数取余%取得的是两个数相除的余数 这里可以看见&#xff0c;在输出加法和减法时&#xff0c;我在后面多加了一个括号&#xff0c;这是因为运算优先级的原因&#xff0c;加…

105. 从前序与中序遍历序列构造二叉树【 力扣(LeetCode) 】

文章目录 零、LeetCode 原题一、题目描述二、测试用例三、解题思路四、参考代码 零、LeetCode 原题 105. 从前序与中序遍历序列构造二叉树 一、题目描述 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的…

Hadoop集群安装

集群规划 node01node02node03角色主节点从节点从节点NameNode√DataNode√√√ResourceManager√NodeManager√√√SecondaryNameNode√Historyserver√ 上传安装包到node01 解压到指定目录 tar -zxvf /bigdata/soft/hadoop-3.3.3.tar.gz -C /bigdata/server/ 创建软链接 cd…

基于Spring Boot的医疗病历B2B平台开发策略

第4章 系统设计 4.1 系统总体设计 系统不仅要求功能完善&#xff0c;而且还要界面友好&#xff0c;因此&#xff0c;对于一个成功的系统设计&#xff0c;功能模块的设计是关键。由于本系统可执行的是一般性质的学习信息管理工作&#xff0c;本系统具有一般适用性&#xff0c;其…

49 | 桥接模式:如何实现支持不同类型和渠道的消息推送系统?

上一篇文章我们学习了第一种结构型模式&#xff1a;代理模式。它在不改变原始类&#xff08;或者叫被代理类&#xff09;代码的情况下&#xff0c;通过引入代理类来给原始类附加功能。代理模式在平时的开发经常被用到&#xff0c;常用在业务系统中开发一些非功能性需求&#xf…

Docker consul注册中心

一、consul 1.1、什么是服务注册与发现 服务注册与发现是微服务架构中不可或缺的重要组件。 起初服务都是单节点的&#xff0c;不保障高可用性&#xff0c;也不考虑服务的压力承载&#xff0c;服务之间调用单纯的通过接口访问。 直到后来出现了多个节点的分布式架构&#x…

如何看一个flutter项目的具体flutter版本

查看pubspec.lock文件 这个项目实际运行的就是 flutter 3.16.6 版本的

模电板测试分析报告【积分/微分电路】

积分电路常用于波形转换&#xff0c;如将矩形波变三角波。对正弦波积分可以实现相移。 微分电路&#xff1a; 为什么直接串联0.1uF电容到反馈线上去&#xff1a; 整改&#xff1a;这么看的话原理图中C58应该换成电阻的。 积分电路下图中红色的换成电容就可以变成微分电路了。 从…

八、随机名字功能

摘要&#xff1a; XML在C#与Unity3D中的实战运用 - PlaneZhong - 博客园 (cnblogs.com) 读取策划提供的配置文件。 策划提供一份execel文档&#xff0c;程序将它转化为一个配置文件&#xff08;xml&#xff09; 首先&#xff1a; XML是一个可扩展标记的语言 一、转换方法…

VSCode运行QT界面

VSCode用久了,感觉Qt Creator的写起代码来还是不如VSCode得心应手,虽然目前还是存在一些问题,先把目前实现的状况做个记录,后续有机会再进一步优化。 当前方式 通过QtCreator创建一个CMake项目,然后使用CMake的方式在VSCode中进行编译。 claude给出的建议 左上角的名字会…

Node.js管理工具NVM

nvm&#xff08;Node Version Manager&#xff09;是一个用于管理多个 Node.js 版本的工具。以下是 nvm 的使用方法和一些常见命令&#xff1a; 一、安装 nvm 下载 nvm&#xff1a; 地址&#xff1a;https://github.com/coreybutler/nvm-windows/releases访问 nvm 的 GitHub 仓…

【C语言】你不知道的知识小盲区——柔性数组

文章目录 一、什么是柔性数组二、柔性数组的特点三、柔性数组的使用四、柔性数组的优势 一、什么是柔性数组 也许你从来没有听说过柔性数组&#xff08;flexible array&#xff09;这个概念&#xff0c;但是它确实是存在的。在C99标准中&#xff0c;如果结构体的最后一个成员是…

sqli-labs less-26 空格绕过

空格绕过 过滤空格 用Tab代替空格%20 %09 %0a %0b %0c %0d %a0 //() 绕过空格注释符绕过//–%20//#–- -;%00; 空白字符绕过SQLite3 —— 0A,0D,0c,09,20 MYSQL 09,0A,0B,0B,0D,A0,20 PosgressSQL 0A,0D,0C,09,20 Oracle_11g 00,0A,0D,0C,09,20 MSSQL 01,02,03,04,05,06,07,…

[瑞吉外卖]-05菜品模块

文件上传下载 介绍 文件上传也称为upload&#xff0c;是指将本地图片、视频、音频等文件上传到服务器上, 可以供其他用户浏览或下载 前端组件库提供了上传组件&#xff0c;但是底层原理还是基于form表单的文件上传。 服务端要接收客户端上传的文件&#xff0c;通常都会使用Ap…

一次Fegin CPU占用过高导致的事故

记录一下 一次应用事故分析、排查、处理 背景介绍 9号上午收到CPU告警&#xff0c;同时业务反馈依赖该服务的上游服务接口响应耗时太长 应用告警-CPU使用率 告警变更 【WARNING】项目XXX,集群qd-aliyun,分区bbbb-prod,应用customer,实例customer-6fb6448688-m47jz, POD实例CP…

Web集群服务-Nginx

1. web服务 1. WEB服务:网站服务,部署并启动了这个服务,你就可以搭建一个网站 2. WEB中间件: 等同于WEB服务 3. 中间件:范围更加广泛,指的负载均衡之后的服务 4. 数据库中间件:数据库缓存,消息对列 2. 极速上手指南 nginx官网: nginx documentation 2.1 配置yum源 vim /etc/…