首页 > 其他分享 >取数

取数

时间:2024-11-09 22:21:01浏览次数:2  
标签:偶数 数列 奇数 位上 取数 剩下 vill

题目描述

现在有一个数列{2,9,1,7,3,4,5,8,6},我和vill-v要轮流从这个数列中取出2个相邻的数,我的目标是为了让这个数列最后剩下的那个数最大,vill-v的目标是为了让最后剩下的那个数最小。

解决思路

(仅针对这道题的特化分析,想看通解的可以直接跳过)

先假设我和vill-v都是绝顶聪明的天才,可以从开始直接推到结果,那我们不难发现,我想把数变大,那我就一定会把对我最不利的两个数,也就是1和2先拿走,但1和2的位置很抽象,在9和7旁边,所以我一定会把7和9一起
去掉。vill-v也是天才,她知道了我必须这么干,所以她会把除了9,7的剩下几个数中最大的两个(即6,8),所以在我操作完两次后就会剩下{3,4,5},这是vill-v就会选择把4,5取走最后剩下答案3.

-----------------------------------------------------------------------------------------------分割线------------------------------------------------------------------------------

通解

上面的那套显然有点太过于复杂,而且极其容易出错(主要是不知道自己算出来是不是对的)
那么好,接下来就是通解了,考虑一个数列一个长度为n(n为奇数)的数列{a1,a2,a3…………,an},我和vill-v要轮流从这个数列中取出2个相邻的数,我的目标是为了让这个数列最后剩下的那个数最大,vill-v的目标是为了让最后剩下的那个数最小。
无论我取走哪两个数,原来在奇数位上的数仍然在奇数位上,偶数位的数同理。我们设n=2k+1(其中k为正整数)则偶数位的数有k个,奇数位有k+1个,因为我和vill-v每次总是会删去一个偶数位上的数和奇数位上的数,所以最后剩下的一定是一个奇数位上的数。
好的,那么现在我们把上面数列的所有奇数位的数拉出来变成一个新数列{b1,b2,b3…………,bn},这下题目改成了,我和vill-v要从{bk}这个数组中每次取一个数出来。

接下来,分类讨论
1.当k为奇数时,显然答案就是b(k+1)/2
2.当k为偶数时,分先后手(相信天才的你一定可以想出来)
-----------------------------------------------------------------------------------------------分割线------------------------------------------------------------------------------


好了,这道题结束了,这道题是由1%的我和99%的我同学(www.cnblogs.com/chihirofujisaki)共同完成,看他好像没有意愿发,而且这个思路真是太美妙了,所以我就写了。
做完后,我们才发现这好像是到信竞题…………

标签:偶数,数列,奇数,位上,取数,剩下,vill
From: https://www.cnblogs.com/vill-v/p/18537387

相关文章

  • 找单独的数(获取数组中只出现一次的数)
    问题描述在一个班级中,每位同学都拿到了一张卡片,上面有一个整数。有趣的是,除了一个数字之外,所有的数字都恰好出现了两次。现在需要你帮助班长小C快速找到那个拿了独特数字卡片的同学手上的数字是什么。要求:设计一个算法,使其时间复杂度为O(n),其中n是班级的人数。尽量减少额......
  • SparkSql读取数据的方式
    一、读取普通文件 方式一:给定读取数据源的类型和地址spark.read.format("json").load(path)spark.read.format("csv").load(path)spark.read.format("parquet").load(path)方式二:直接调用对应数据源类型的方法spark.read.json(path)spark.read.csv(path)spark.read.pa......
  • c语言中获取数组的长度
     001、一维数组[root@PC1test1]#lstest.c[root@PC1test1]#cattest.c#include<stdio.h>intmain(void){intv1[5]={3,4,8};printf("lengthofv1is%d\n",sizeof(v1)/sizeof(v1[0]));return0;}[root@PC1tes......
  • luoguP1005 矩阵取数游戏
    有n*m的矩阵,每个元素a[i][j]均为非负整数,游戏规则如下:每轮从每行各取一个元素,共n个。经过m轮后取完所有元素。每次取走的元素只能是该元素所在行的行首或行尾。每轮取数都有一个分值,为每行取数的得分之和,每行取数的得分为被取走的元素值乘以2的i次方,其中i为取数轮次,从1开始。......
  • Python数据分析NumPy和pandas(十八、从Web APIs 和 数据库中获取数据)
    一、与WebAPIs进行数据交互很多Web网站都提供公共的API,并通过JSON或其他格式提供数据。那Python也有很多种方法可以访问网站提供的API,其中一种常用的方法是通过使用requests库,使用之前需要先安装它,这里通过pip安装:pipinstall requests下面我通过GitHub网站提供的API......
  • 获取数据类型js
    functiongetFieldType(field){if(field===null){return'null';}switch(typeoffield){case'undefined':return'undefined';case'string':return&......
  • P1004 NOIP2000 提高组 方格取数
    P1004NOIP2000提高组方格取数-洛谷分析与[[小烈送菜]]算姐妹题了,这个辈分甚至更老一点。如果直接按照题目,从\(A,B\)两点分别出发,那么有个问题就是不确定性,计算的时候不可控因素很多。可以注意到,从\(B\)点往回走到\(A\)点,是和从\(A\)点再走一遍走到\(B\)点是......
  • Redis 厨神:用 StringRedisTemplate 轻松获取数据的秘笈
    前言在这个快节奏的时代,数据处理就像烹饪,既需要精准的配料,又需要高超的烹饪技巧。想象一下,你在厨房里忙得不可开交,却被突如其来的订单搞得手忙脚乱。今天,我们要揭开如何用StringRedisTemplate轻松获取数据的秘密,让你在SpringBoot3.x的世界里,摇身一变,成为Redis的厨房大......
  • P7074 [CSP-J2020] 方格取数 题解
    动态规划dp方格取数类似于数字三角形,均可以使用动态规划直接秒杀.但此题有$3$个方向:上、右、下.所以可以定义一个三维数组dp数组.假设$f_{i,j,1}$是从右、上方到达$(i,j)$的和的最大值.又有$f_{i,j,0}$是从右、下方到达$(i,j)$的和的最大值.我们可以先确定......
  • PbootCMS打开后提示读取数据库文件失败: Unable to open database
    问题表现打开PbootCMS时提示“读取数据库文件失败:Unabletoopendatabase”。原因数据库文件没有读写权限。解决方法设置文件夹权限:将 data 文件夹设置为777权限。同时将 config、static、runtime、data 文件夹设置为可读写权限。注意事项备份文件......