abdul subhan mohammed Ответов: 2

Даже суммы-это игра для двух игроков, в c#.


Даже суммы-это игра для двух игроков. Игроки получают последовательность из N положительных целых чисел и поочередно сменяют друг друга. В каждом повороте игрок выбирает непустой срез (подпоследовательность последовательных элементов) таким образом, чтобы сумма значений в этом срезе была четной, затем удаляет срез и объединяет оставшиеся части последовательности. Первый игрок, который не может сделать законный ход, проигрывает игру.

Вы играете в эту игру против своего противника и хотите знать, можете ли вы выиграть, предполагая, что и вы, и ваш противник играете оптимально. Ты двигаешься первым.

Напишите функцию:

class Solution { public string solution(int[] A); }

это, учитывая нулевой индексированный массив A, состоящий из N целых чисел, возвращает строку формата "X, Y", где X и Y являются соответственно первой и последней позициями (включительно) среза, который вы должны удалить на первом ходу, чтобы выиграть, предполагая, что у вас есть выигрышная стратегия. Если существует более одного такого выигрышного среза, функция должна вернуть тот, который имеет наименьшее значение X. Если существует более одного среза с наименьшим значением X, функция должна возвращать самый короткий. Если у вас нет выигрышной стратегии, функция должна вернуть "нет решения".

Например, учитывая следующий массив:
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 " (с четной суммой 3 + 7 = 10) также является выигрышным ходом, но срез "1,2" имеет меньшее значение X.

Для следующего массива:
A[0] = 2
A[1] = 5
A[2] = 4

функция должна возвращать "нет решения", так как нет стратегии, гарантирующей вам выигрыш.

Что:

N-целое число в диапазоне [1..100 000];
каждый элемент массива A является целым числом в диапазоне [1..1 000 000 000].

Сложность:

ожидаемая наихудшая временная сложность равна O (N);
ожидаемая наихудшая сложность пространства - O (N), выходящая за пределы входного хранилища (не считая хранилища, необходимого для входных аргументов).

Элементы входных массивов могут быть изменены.

Что я уже пробовал:

public static int solution(int[] A)
        {
            // write your code in C# 6.0 with .NET 4.5 (Mono)
            int[] forw = new int[A.Length];
            int[] rewi = new int[A.Length];

            bool isAllNeg = true;

            for (int i = 1; i < A.Length; i++)
            {
                forw[i] = Math.Max(0, forw[i - 1] + A[i]);
                if (A[i] > 0 && isAllNeg)
                    isAllNeg = false;

            }

            if (isAllNeg)
            {
                return 0;
            }

            for (int i = A.Length - 2; i >= 0; i--)
            {
                rewi[i] = Math.Max(0, rewi[i + 1] + A[i]);
            }

            int maxsum = 0;
            for (int i = 1; i < A.Length - 1; i++)
            {
                maxsum = Math.Max(maxsum, forw[i - 1] + rewi[i + 1]);
            }

            return maxsum;
        }


ошибка компиляции: не удается неявно преобразовать int в string.

может ли кто-нибудь мне помочь

Спасибо

F-ES Sitecore

На какой линии находится ошибка?

2 Ответов

Рейтинг:
0

OriginalGriff

Ошибка не в этом коде: она, возможно, в коде, который ее вызывает.
Начните с Visual studio и дважды щелкните сообщение об ошибке на панели "список ошибок".
Это приведет вас к строке, в которой есть проблема, и подчеркнет часть ошибки красным цветом.
Посмотрите внимательно на строку, и вам должно быть совершенно очевидно, где вы пытаетесь объединить целые числа и строки. Если это то, что вы хотите сделать, то вам понадобится явное преобразование, поэтому используйте метод ToString для целочисленного значения.


Рейтинг:
0

Member 10185944

I got solution using javascript , please refer below code,

Javascript Code :

    function len(obj){
    if(obj instanceof Array || typeof obj === &amp;quot;string&amp;quot;)
        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 &amp;gt; end) {
        res = &amp;#39;NO SOLUTION&amp;#39;;
    }
    else {
        res = start.toString() + &amp;#39;,&amp;#39; + end.toString();
    }

    return res;
    }

    function trans(strr){
    if (strr ==&amp;#39;NO SOLUTION&amp;#39;) {
        return [1, -1]
    }
    else {
       a = strr.split(&amp;#39;,&amp;#39;);
    }
        
    return [parseInt(a[0]), parseInt(a[1])];
    }

    function solution(A){
    odd_list = [];
    for(var ind=0; ind&amp;lt;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&amp;lt; 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 &amp;gt;= count) {
        res_cand.push(trans(check(odd_list[1] + 1 , len(A) - 1 - count ))); 
     }
        
     if (first_count &amp;gt;= count) {
        res_cand.push(trans(check(odd_list[1] + count + 1, len(A) - 1))) 
     }
          
    twosum = first_count + second_count;
    
    if (second_count &amp;lt; count &amp;amp;&amp;amp; count &amp;lt;= 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 &amp;gt;= count) {
        res_cand.push(trans(check( count, odd_list[odd_list.length-2] - 1 )));
    }

    if (second_count &amp;gt;= count) {
        res_cand.push(trans(check( 0, odd_list[odd_list.length-2] - count - 1)))
    }
        
    twosum = first_count + second_count;
    
    if(second_count &amp;lt; count &amp;amp;&amp;amp; count &amp;lt;= 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 &amp;gt;= 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] &amp;lt; b[0]) ? -1 : 1;
    }
    }

You can get the answer in below fiddle link

https://jsfiddle.net/3ed1kuoj/</pre>


NotPolitcallyCorrect

Ваш код не является C# и все равно не будет компилироваться.