найти количество минимумов или максимумов в наборе чисел - PullRequest
0 голосов
/ 11 октября 2018

Пользователь вводит n чисел, за которыми следует следовать в следующей строке, а затем вводит n чисел a1, a2, ..., an.Эти цифры высоты некоторых гор.Набор этих чисел «ПРИНИМАЕТСЯ», если есть только один максимум или минимум.например, «1 2 3 2 1», имеет только один максимум, который равен 3. Также «1 2 3 4» имеет один максимум.но «1 10 9 8 7 6 5 6 7» неприемлемо, поскольку оно имеет два максимума (10 и 7) или два минимума (1 и 5).

Другими словами, набор является приемлемым, если итолько если он находится в одной из следующих форм:

a1 <= a2 <= a3 ... <= ai> a (i + 1)> ...> an

или

a1> = a2> = a3 ...> = ai

Я должен представить ответ в системе судьикоторый проверяет это с неизвестными контрольными случаями. Использование любого типа массива или вектора полностью запрещено.

Мое решение таково:

//C code.
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n,temp;
    scanf("%d",&n);
    if (n==1)
    {
        int l;
        scanf("%d",&l);
        printf("Yes");
    }
    else
{
    int a,b;
    int last;
    int changes =0;
    int dec =0 , inc =0; //flag: checking if the set is incremental or decremental till now
    scanf("%d %d",&a,&b);

    if (a>b)
    {
        dec=1;
    }
    else if (a<b)
    {
        inc = 1;
    }
    else
    {
        inc =1;
        dec = 1;
    }
    last = b;
    for (int i =2;i<n;i++)
    {

        scanf("%d",&temp);
        if (temp>last && dec==1)
        {
            inc = 1;
            dec= 0;
            changes++;
        }
        if (temp<last && inc==1)
        {
            inc =0;
            dec=1;
            changes++;
        }


if (!(inc==1 && dec==1) && temp == last)
        {
            changes++;
        }
    last = temp;
        last = temp;
    }
    if (changes <=1)
    {

        printf("Yes");
    }
    else
    {
        printf("No");
    }
}
    return 0;
}

Он получает правильный ответ для примеров, которые в вопросено это не удается на некоторых неизвестных тестовых случаях.Есть идеи как это исправить?Может ли кто-нибудь дать мне контрольный пример, который не решен прямо в этом коде?

P.1: я добавил

if (!(inc==1 && dec==1) && temp == last)
    {
        changes++;
    }

, и он принял один из неудачных контрольных примеров, но все еще один остается.

P.2:

Это мой другой алгоритм, который не срабатывает в некоторых тестовых случаях, но судья принимает свои ответы в случае неудачных тестов в первом:

    #include <stdio.h>
#include <stdlib.h>

int main()
{
    int n;
    int inc=0;
    int dec=0;
    int peak=0;
    int valley=0;
    int last = -1;
    int a;
    scanf("%d",&n);
    for (int i =0;i<n;i++)
    {
        if (last!=-1)
        {
            last =a;
        }
        scanf("%d",&a);
        if (last!=-1)
        {
            if (a>last)
            {
                if (!(inc==1))
                {
                    valley++;
                    inc =1;
                    dec=0;
                }
            }
            if (a<last)
            {
                if (!(dec==1))
                {
                    peak++;
                    dec=1;
                    inc =0;
                }
            }
        }
        last =0;


    }
    if (valley<=1 && peak<=1)
    {
        // printf("valley: %d , peak:%d",valley,peak);
        printf("Yes");
    }
    else
    {
        printf("No");
    }
    return 0;
}

С.3

Новый алгоритм:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    long long int n,temp;
    scanf("%lld",&n);
    if (n==1)
    {
        long long int l;
        scanf("%lld",&l);
        printf("Yes");
    }
    else
{
    long long int a,b;
    long long int last;
    long long int changes =0;
    int dec =0 , inc =0; //flag: checking if the set is incremental or decremental till now
    scanf("%lld %lld",&a,&b);

    if (a>b)
    {
        dec=1;
    }
    else if (a<b)
    {
        inc = 1;
    }
    else
    {
        inc =1;
        dec = 1;
    }
    last = b;
    for (long long int i =2;i<n;i++)
    {

        scanf("%lld",&temp);
        if (temp>last && dec==1)
        {
            inc = 1;
            dec= 0;
            changes++;
        }
        if (temp<last && inc==1)
        {
            inc =0;
            dec=1;
            changes++;
        }
        if (changes>=1 && temp == last)//new change
        {
            changes+=100;
        }//end of new change
        last = temp;
    }
    if (changes <=1)
    {

        printf("Yes");
    }
    else
    {
        printf("No");
    }
}
    return 0;
}

Ответы [ 5 ]

0 голосов
/ 12 октября 2018

Судья наконец принял этот кодекс.Основные проблемы были с условиями, когда некоторые числа становились равными, например, 111222. Кроме того, постановка задачи была правильной, и она не была <= или> = после ai.

Код в C:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    long long int n,temp;
    scanf("%lld",&n);
    if (n==1)
    {
        long long int l;
        scanf("%lld",&l);
        printf("Yes");
    }
    else
{
    long long int a,b;
    long long int last;
    int flag =1;
    long long int changes =0;
    int incr=0,decr=0;
    int equ=0;
    int dec =0 , inc =0; //flag: checking if the set is incremental or decremental till now
    scanf("%lld %lld",&a,&b);

    if (a>b)
    {
        dec=1;
    }
    else if (a<b)
    {
        inc = 1;
    }
    else
    {
        equ=1;
    }
    last = b;
    for (long long int i =2;i<n;i++)
    {

        scanf("%lld",&temp);
        if (temp > last && equ==1)
        {
            inc = 1;
            dec=0;
            equ=0;
        }
        else if (temp <last && equ==1)
        {
            inc = 0;
            dec = 1;
            equ= 0;
        }
       else if (temp>last && dec==1)
        {
            inc = 1;
            dec= 0;
            changes++;
            incr++;
        }
        else if (temp<last && inc==1)
        {
            inc =0;
            dec=1;
            changes++;
            decr++;
        }
        if (changes>=1 && temp == last && incr>=0 && decr >=0)
        {
            flag = 0;
            changes+=100;
        }
        last = temp;
    }
    if (changes <=1&& flag)
    {

        printf("Yes");
    }
    else
    {
        printf("No");
    }
}
    return 0;
}
0 голосов
/ 11 октября 2018

Мы должны обнаружить изменение направления неравенства, а затем запретить дальнейшее изменение.В любом случае, пока элементы равны, вы не можете определиться между ростом или уменьшением.

Я бы использовал переменную состояния с шестью возможными значениями:

  • x: элемент еще не был введен;

  • 0: мы ничего не знаем;

  • 1:мы находимся в начальной секции повышения;

  • -1: мы находимся в начальной секции падения;

  • 2: мы находимсяв последней секции повышения;

  • -2: мы находимся в последней секции падения.

Учитывая предыдущие и текущие входные значения,применяются следующие переходы:

State  x: -> 0 (unconditionally)
State  0: p < c ->  1, p > c -> -1
State  1: p > c -> -2
State -1: p < c ->  2
State  2: p >= c -> Fail
State -2: p <= c -> Fail

Исходное состояние x.Если мы никогда не потерпим неудачу, успех предполагается, когда ввод был исчерпан.Это можно реализовать с помощью простого оператора switch и двух статических переменных, чтобы запомнить предыдущее значение и состояние.

В спецификациях неясно, может ли какой-то раздел быть пустым, поэтому я оставлю его как есть.

Python подтверждение концепции:

Input= [1, 2, 3, 2, 1]
#Input= [1, 10, 9, 8, 7, 6, 5, 6, 7]
#Input= [1, 2, 3, 4]
#Input= [4, 1, 2, 1, 1]

def Process(c):
    global p, s

    if s == None:
        s= 0
    elif s == 0:
        if p < c:
            s= 1
        elif p > c:
            s= -1
    elif s == 1:
        if p > c:
            s= -2
    elif s == -1:
        if p < c:
            s= 2
    elif s == 2:
        if p >= c:
            exit(-1)
    elif s == -2:
        if p <= c:
            exit(-1)
    p= c

s= None
for c in Input:
    Process(c)
0 голосов
/ 11 октября 2018

«4 1 1 2 1» говорит «нет», но должно говорить «да».Код неправильно обрабатывает случай, когда inc и dec изначально оба равны 1.

Кроме того, код должен использовать разные критерии для первой части последовательности (вплоть до первого изменения направлениянаблюдается) и второе.В первой части равенство разрешено и не вызывает никакой дисквалификации или смены государства.Во второй части равенство дисквалифицирует.

Шутка

Я не должен этого делать, но иногда невозможно сопротивляться.Следующее должно решить проблему.Не используйте его.

#include <stdio.h>

int main(void)
{
    int c, n, p, s;
    scanf("%d%d", &n, &c);

    #define Table   \
        {  1,  0,  3 }, \
        {  1,  1,  2 }, \
        { -1, -1,  2 }, \
        {  4,  3,  3 }, \
        {  4, -1, -1 }, \

    for (s = 0; 0 <= s && --n; s = (int [][3]) {Table} [s] [1+(p>c)-(p<c)])
        { p = c; scanf("%d", &c); }

    printf("%s\n", 0 <= s ? "Yes" : "No");
}
0 голосов
/ 11 октября 2018

В решении по п.2 «4 1 2 1 1» принимается, но не должно, поскольку 1 не больше 1!

0 голосов
/ 11 октября 2018

scanf("%d",l); должно быть scanf("%d", &l);, scanf требует адрес переменной.

Таким образом, тестовые случаи с n == 1 не пройдены.

Всегда смотрите напредупреждения компилятора: https://ideone.com/MKq3WK

...