Почему я не могу вывести пару sh после ограничения в векторе? - PullRequest
0 голосов
/ 25 апреля 2020

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

Код работает до последовательности 1041 (указав c после отладки). Просто для отладки я добавил оператор печати после нажатия каждой пары внутри вектора. Для длины 1042 код показывает нажатие 1040, затем нажатие 1 (что странно), а затем просто зависание там.

Я прилагаю код, а также ввод и вывод терминала.

Вы можете просто проверить основную функцию

Код

#include <iostream>
#include <vector>
#include <algorithm>
#include <chrono>

using namespace std;

bool comparator_function(pair<int, int> a, pair<int, int> b) {
    return (a.first < b.first);
}

//index_added -> the index at which the latest element was added
void set_r_array(int* r_array_ref, int* per_array_ref, int size, int* count, int index_added) {

    for(int i = 1;i <= size; i++) {
        count[i] = 0;
    }

    int temp = index_added;

    while(index_added <= size) {
        if(index_added == size) {
            if(per_array_ref[index_added] == 0) {
                r_array_ref[temp] = size;
                break;
            }
            else {
                r_array_ref[temp] = -1;
                break;
            }
        }
        else {
            if(per_array_ref[index_added] == 0) {
                r_array_ref[temp] = index_added;
                break;
            }
            else {
                index_added++;
            }
        }
    }

    for(int i = 1;i <= size; i++) {
        if(r_array_ref[i] != -1) {
            count[r_array_ref[i]]++;
        }
    }
}

bool check_max(int* count, int next_element, int size) {

    int max_count = -1, index = 0;

    for(int i = 1;i <= size; i++) {
        int temp_val = count[i];
        if(max_count <= temp_val) {
            max_count = temp_val;
            index = i;
        }
    }

    int num = 0;

    for(int i = 1;i <= size; i++) {
        if(count[i] == max_count) {
            num++;
        }
    }

    //one max
    if(num == 1) {
        if(next_element == index) {
            return true;
        }
        return false;
    }

    else {
        for(int i = 1;i <= size; i++) {
            if(count[i] == max_count) {
                if(next_element == i) {
                    return true;
                }
            }
        }
        return false;
    }
}

int main() {
    int testCases;

    cin >> testCases;
    cin.ignore();

    while(testCases-- > 0) {
        int n, result_flag = 0;
        cin >> n;
        cin.ignore();
        vector<pair<int, int>> per;
        int temp;

        for(int i = 0;i < n; i++) {
            cin >> temp;
            pair<int, int> temp_pair = make_pair(temp, i+1);
            per.push_back(temp_pair);
            //debug statement
            cout << "pushed " << temp << endl;
        }

        auto start = std::chrono::high_resolution_clock::now();

        cout << "start" << endl;

        sort(per.begin(), per.end(), comparator_function);

        int permutation_array[n+1], r_array[n+1], count[n+1];
        for(int i = 0;i <= n; i++) {
            permutation_array[i] = 0;
            r_array[i] = i;
            count[i] = 1;
        }

        cout << "end" << endl;

        permutation_array[per[0].second] = per[0].first;
        set_r_array(r_array, permutation_array, n, count, per[0].second);

        //insertion of numbers
        for(int i = 1;i < n; i++) {
            //check if the next element inserted has the largest count rn or not
            int next_element = per[i].second;
            if(!check_max(count, next_element, n)) {
                cout << "No" << endl;
                result_flag = -1;
                break;
            }

            permutation_array[per[i].second] = per[i].first;
            set_r_array(r_array, permutation_array, n, count, per[i].second);
        }

        if(result_flag == 0) {
            cout << "Yes" << endl;
        }

        auto stop = std::chrono::high_resolution_clock::now();

        auto duration = std::chrono::duration_cast<std::chrono::microseconds>(stop - start);

        cout << "Time: " << duration.count() << " microseconds" << endl;
    }
}

Вход 1

1
5
2 3 4 5 1

Выход 1

pushed 2
pushed 3
pushed 4
pushed 5
pushed 1
start
end
Yes

Вход 2

1
1042
1 2 3 4 ... so on till 1042

Выход 2

pushed 1
pushed 2
.
.
.
pushed 1040
pushed 1

and then hangs, from here on

Сложность кода O (n ^ 2). Так что я не думаю, что это как-то связано с этим. Поскольку вход может быть в максимальном порядке 10 ^ 4. Более того, в соответствии с отладкой печати, я думаю, что проблема связана с вводом.

1 Ответ

2 голосов
/ 25 апреля 2020

У вас возникла проблема с вводом, когда вы достигли ограничения строки консоли.

Поместите свой ввод в файл, чтобы решить эту проблему.

Тогда вы сможете отладить свой алгоритм, который кажется более сложнее, чем нужно.

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