当前位置: 首页 > 知识库问答 >
问题:

Codility EvenSums游戏

计向晨
2023-03-14

我正在努力完成难度挑战,以提高我的编程技能。挑战的细节在这里。< br >我也会将问题陈述复制到这里。

偶数和是两个玩家的游戏。玩家被赋予一个由N个正整数组成的序列,并轮流进行。在每个回合中,玩家选择一个非空的切片(连续元素的子序列),使得该切片中的值之和是偶数,然后移除该切片并连接序列的其余部分。第一个不能进行合法移动的玩家输掉比赛。

如果你和你的对手玩这场游戏,你想知道你是否能赢,假设你和对手都玩得很好。你先走。

编写函数:

字符串解(向量

给定一个由 N 个整数组成的零索引数组 A,html" target="_blank">返回一个格式为“X,Y”的字符串,其中 X 和 Y 分别是切片的第一个和最后一个位置(包括),为了获胜,您应该在第一次移动时将其删除以获胜,假设您有一个获胜策略。如果有多个这样的获胜切片,则该函数应返回值为 X 最小的切片。如果有多个切片的最小值为 X,则该函数应返回最短值。如果您没有获胜策略,则该函数应返回“NO SOLUTION”。

例如,给定以下数组:

A[0]=4 A[1]=5 A[2]=3 A[3]=7 A[4]=2函数应返回“1,2”。从位置1到2删除一个切片(偶数和为5 3=8)后,剩余的数组为[4,7,2]。然后对手将能够删除第一个元素(偶数和4)或最后一个元素(偶和2)。然后,你可以做出一个移动,使数组只包含[7],这样你的对手就不会有合法的移动,并且会输。下图显示了一种可能的游戏:

请注意,移除切片“2,3”(37 = 10的偶数和)也是获胜的一步,但切片“1,2”的x值较小。

对于以下数组:

A[0]=2 A[1]=5 A[2]=4函数应该返回“NO SOLUTION”,因为没有策略可以保证您获胜。

假设:

N是[1..100000]范围内的整数;数组A的每个元素都是[1..1000000000]范围内的整数。复杂性:

预期最坏情况时间复杂度为O(N);预期最坏情况的空间复杂度为O(N),超出了输入存储(不包括输入参数所需的存储)。输入数组的元素可以修改。

首先,我对问题陈述有一个误解,即为什么在给定的示例中,第一个玩家在第一次移动时不能将4作为偶数范围,所以函数应该返回0,0而不是1,2。


第二,我解决这个问题的想法是计算输入数组中偶数区间的个数,如果数是偶数,那么一号玩家赢了,我应该找到一号玩家可以取的第一个偶数区间。

但是我无法在分配的时间内解决它,并且无法再次参加测试。

这是我尝试的代码:

    string solution(vector<int> &A) {
    int num_even_ranges = 0;
    int sum = 0;
    for (int i = 0; i < A.size(); i++)
    {
        sum += (A[i]%2);
        if (sum % 2 == 0 || A[i]%2 == 0)
        {
            num_even_ranges++;
            sum = 0;
        }
    }
    if (num_even_ranges % 2 == 0)
        return "NO SOLUTION";
    sum = 0;
    int start = 0;
    for (int i = start; i < A.size(); i++)
    {
        sum += A[i];
        if (sum % 2 == 0 && i > start)
        {
            return to_string(start) + "," + to_string(i);
        }

        if (i + 1 < A.size())
        {
            if (A[i] % 2 == 0 && A[i+1] % 2 == 1)
            {
                sum = 0;
                start = i + 1;
            }
        }
    }
}


我对这个问题的解决方案是正确的吗?如果不是,这个有趣问题的正确解决方案是什么?

共有3个答案

海岳
2023-03-14

移动(0,0)是有效的,因为在每个回合中,玩家只能使用和为偶数的子序列进行移动。

"在每个回合中,玩家选择一个非空切片(连续元素的子序列),使得该切片中的值之和为偶数"

注意:每次移动后,我们仅考虑剩余序列的操作/移动

After player1's first move(0,0), the remaining sequence will be [5,3,7,2],
then player2's first move(0,1), the remaining sequence will be [7,2],
then player1's second move(1,0), the remaining sequence will be [7]
Now player 2 is unable to make any legal move! So player 1 win's 

因此这是一个成功的策略!

姚善
2023-03-14

我得到了Javascript的解决方案,请参考下面的代码

Javascript代码:

function len(obj){
if(obj instanceof Array || typeof obj === "string")
    return obj.length;
else {
    var count = 0;
    for(var i in obj){
        if(obj.hasOwnProperty(i))
        count++;
    }
    return count;
}
}

function check(start, end) {
if (start > end) {
    res = 'NO SOLUTION';
}
else {
    res = start.toString() + ',' + end.toString();
}

return res;
}

function trans(strr){
if (strr =='NO SOLUTION') {
    return [1, -1]
}
else {
   a = strr.split(',');
}

return [parseInt(a[0]), parseInt(a[1])];
}

function solution(A){
odd_list = [];
for(var ind=0; ind<A.length; ind++)
{
    if(A[ind]%2==1) {
        odd_list.push(parseInt(ind));    
    }
}

if (len(odd_list)%2 == 0) {
    return check(0, len(A) - 1);
}

 tempList = odd_list;
 odd_list = [];

 odd_list.push(-1);

 for(var i=0; i< tempList.length; i++) {
     odd_list.push(tempList[i]);
 }

 odd_list.push(len(A));

 var res_cand = [];
 count = odd_list[1];
 second_count = len(A) - 1 - odd_list[odd_list.length-2];
 first_count = odd_list[2]- odd_list[1] - 1;

 if (second_count >= count) {
    res_cand.push(trans(check(odd_list[1] + 1 , len(A) - 1 - count ))); 
 }

 if (first_count >= count) {
    res_cand.push(trans(check(odd_list[1] + count + 1, len(A) - 1))) 
 }

twosum = first_count + second_count;

if (second_count < count && count <= twosum) {
    res_cand.push(trans(check(odd_list[1] + (first_count - (count -     second_count )) + 1, odd_list[odd_list.length-2] )));
}

count = len(A) - 1 - odd_list[odd_list.length-2];
first_count = odd_list[1];
second_count = odd_list[odd_list.length-2] - odd_list[odd_list.length-3] - 1;

if(first_count >= count) {
    res_cand.push(trans(check( count, odd_list[odd_list.length-2] - 1 )));
}

if (second_count >= count) {
    res_cand.push(trans(check( 0, odd_list[odd_list.length-2] - count - 1)))
}

twosum = first_count + second_count;

if(second_count < count && count <= twosum) {
    res_cand.push(trans(check(count-second_count, odd_list[odd_list.length-3])))
}

cur = [-1, -2];

res_cand =  res_cand.sort(sortFunction);

for(var i= res_cand.length-1 ; i >= 0 ; i--) {
      var row = res_cand[i]; 
      if(row[0] !== -1) {
        cur = row;  
      }
}

return check(cur[0], cur[1]);
}

function sortFunction(a, b) {
if (a[0] === b[0]) {
    return 0;
}
else {
    return (a[0] < b[0]) ? -1 : 1;
}
}

你可以在下面的小提琴链接中得到答案。

https://jsfiddle.net/3ed1kuoj/

司允晨
2023-03-14

关于你的第一个问题,如果第一个玩家拿4(0,0),剩下的数组是:5,3,7,2。然后对手可以拿下3,7,2,第一个玩家将失去,因为剩下的5个是奇数。所以这不是有效的解决方案。

 类似资料:
  • 游玩UMD™游戏     开始游玩游戏 1. 插入UMD™。 2. 选择 (游戏) > (UMD™)。 离开游戏 于游玩时按下PS按钮(HOME(归返)按钮)。请遵循画面指示,正确操作。 关于保存数据 保存数据会保存至Memory Stick™,并于(管理保存数据)显示。

  • 实习,捕鱼棋牌类项目 # 一面 7/26 21min ## C++ 栈和堆的区别 const int *p 和 int * cont p 的区别 const 对象能调用全部成员函数吗 继承 public private protected 的区别 class struct 怎么计算大小 内存对齐是什么,为什么要内存对齐,内存对齐的规则 小端大端的区别 ## Unity Awake Enable S

  • 3/10投递,3/19收到消息,3/21笔试 题型为单选和问答。时间90min。 单选11题共55分。主要内容是游戏常识和概率题。游戏常识考的偏单机和rogue,应该是跟岗位相关的。 问答5题共75分。问了最爱的游戏,分析一个系统,分析游戏关卡,分析战斗系统,分析付费体验。 总体难度一般,问的跟岗位挺相关的。#春招##尚游游戏笔试##笔经#

  • PS Vita上可游玩存储于PlayStaiton®Vita卡或从PlayStation®Store下载的游戏。 游戏的LiveArea™ 游玩PlayStaiton®Vita卡的游戏 游玩从PlayStation®Store下载的游戏 将使用PS3™下载的游戏复制至PS Vita游玩 在PS Vita游玩PSP™ (PlayStation®Portable)的游戏

  • 说一下自己学过哪些课程 TCP协议特点 TCP协议高级点的特点 慢启动,拥塞控制 为什么进行拥塞控制 https加密流程 https中证书是怎么拿到的,里面包含什么? 证书为什么放在第三方? Java中list由哪些子类? ArrayList数据结构是什么样的?具体是怎么实现的 有个电脑,向另一个电脑通过程序发送数据,这个数据在硬件层面怎么流动的,经过那些步骤 NAT原理 传输层的报头是什么? 基

  • 包含在程序启动时启动的线程。这个线程包含一个循环,每40毫秒更新一次游戏并重新绘制()board。 备选办法B: 板创建一个摆动计时器。这个计时器的动作监听器是板本身。actionPerformed()方法每40毫秒运行一次,并更新game+repaints Board()。 谢谢

  • 游玩已下载的游戏 可游玩自(PlayStation®Store)下载(购买)的游戏。 开始游玩游戏 1. 选择 (游戏)的 (Memory Stick™) 或 (主机内存)。 2. 选择想启动之游戏的图示。 离开游戏 游玩游戏时按下PS按钮(HOME(归返)按钮)。请遵循画面指示,正确操作。 暂停游戏 保存游玩中的游戏进度,再暂时离开游戏。 游玩游戏时按下PS按钮。请遵循画面指示,正确操作。 要使

  • 2024.02.26 一面 谈谈两个印象深刻的项目 css隐藏元素的几种方式 通过link引入样式和import有什么区别 跨域是如何产生的,该如何解决跨域 vue缓存数据和组件的方式 面试官只问了几个问题,相对简单。