Учитывая массив S размера N, проверьте, можно ли разбить последовательность на две последовательности - PullRequest
0 голосов
/ 16 июня 2020

Учитывая массив S размера N, проверьте, можно ли разделить последовательность на две последовательности - s1 to si и si + 1 to sN так, чтобы первая последовательность строго убывала, а вторая - строго возрастала.
Формат ввода
Первая строка содержит одно целое число N, обозначающее размер ввода.
Следующие N строки содержат одно целое число, каждая из которых обозначает элементы массива S.

Ограничения
0 < N < 1000, каждое число в последовательности S равно > 0 и < 1000000000

Формат вывода
Вывод логических значений на печать - "true" или "false", определяющих, является ли последовательность увеличивается - уменьшается или нет.

Пример ввода
5 1 2 3 4 5

Пример вывода
true

Пояснение
Внимательно прочтите условия для судить, какие все последовательности могут быть действительными. Не используйте массивы или списки.
Мой код набрал 77.78/100 баллов, я не могу понять ошибку, может ли кто-нибудь помочь мне.

#include<iostream>
using namespace std;
int main() {
    int n;
    long long int p,c;

    cin >> n;
    cin >> p;
    bool dec=true;
    int a=0;
    if (n<=0 || n==1) {
        a=1;
    }
    for (int i=1;i<n;i++) {
        cin >> c;
        if (p==c) {
            a=1;
        }
        else if (p<c) {
            if (dec) {
                dec=false;
            }
            else {
                dec=false;
                a=0;
            }
        }
        else if (c > p) {
            if (dec) {
                a=0;
            }
            else {
                a=1;
                dec=false;
            }
        }

    }
    if(a==0){
        cout<<"true";
    }
    else {
        cout<<"false";
    }
    return 0;
}

1 Ответ

0 голосов
/ 17 июня 2020

Я протестировал ваш код в некоторых тестовых примерах, и кажется, что ваш код не работает,

n = 2
1 1

Ответ должен быть True, так как его можно разбить на {1}, {1} и поскольку одиночный Элемент увеличивается, а также уменьшается и то, и другое, ответ верный.

Вот мой код. Объяснение: Вся моя концепция основана на том, что нам нужно проверить, может ли данная последовательность быть разбита на 2 подпоследовательности. Поэтому я сохранил переменную Seq_no для отслеживания, поэтому, если в конце кода, если значение Seq_no не должно превышать 2, также существует вероятность того, что последовательность может быть полностью строго убывающей, поэтому в этом случае, если n не равно 1, то ответ верный.

#include <iostream>
#include <limits.h>
using namespace std;


int main() 
{

    int n, curr, prev = INT_MAX, Seq_no = 1;

    int i;

    cin >> n;

    for(i = 0; i < n; i++)
    {
        cin >> curr;

        if(Seq_no == 1) // for stricly decreasing
        {
            if(prev <= curr)
            {
                Seq_no++;
            }

        }
        else  // for stricly decreasing
        {
            if(prev >= curr)
            {
                Seq_no++;
                break;
            }

        }
        prev = curr;
    }

    if(Seq_no == 2 || (Seq_no == 1 && n != 1)) 
        cout << "true\n";
    else 
        cout << "false\n";

    return 0;
}

Если я решил вашу проблему, то пожалуйста. примите ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...