Задачка на олимпиаду С++

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

Входные данные В первой строке записано число N. В следующей строке записано N целых чисел. Все числа по модулю не превышают 100.

Выходные данные Вывести элементы массива, повторяющиеся в одной строке через пробел.

Пример 1:

Входные данные

7

0 1 -2 1 0 0 3

Выходные данные

0 1

Пример 2:

Входные данные

5

-1 -2 0 2 1

Выходные данные

NO

#include <iostream>

using namespace std;

int main() {
    int n, number, countt = 0, count[201], mas[201];
    cin >> n;
    for (int i = 0; i <= 200; i++) {
        count[i] = -150;
        mas[i] = -150;
    }
    for (int i = 0; i < n; i++) {
        cin >> number;
        if (number > 0) {
            if (number == 100) {
                if (mas[200] != number) {
                    mas[200] = number;
                    count[200] = 1;
                }
                else {
                    count[200]++;
                }
            }
            else {
                if (mas[number + 100] != number) {
                    mas[number + 100] = number;
                    count[number + 100] = 1;
                }
                else {
                    count[number +100]++;
                }
            }
        }
        else if (number < 0) {
            if (number == -100) {
                if (mas[0] != number) {
                    mas[0] = number;
                    count[0] = 1;
                }
                else {
                    count[0]++;
                }
            }
            else {
                if (100 - mas[abs(number)] != number && count[100 - abs(number)] < 0) {
                    mas[100 - abs(number)] = number;
                    count[100 - abs(number)] = 1;
                }
                else {
                    count[100 - abs(number)]++;
                }
            }
        }
        else {
            if (mas[100] != number) {
                mas[100] = number;
                count[100] = 1;
            }
            else {
                count[100]++;
            }
        }
    }
    for (int i = 0; i <= 200; i++) {
        if (count[i] > 1) {
            cout << mas[i] << " ";
            countt++;
        }
    }
    if (countt == 0) {
        cout << "NO";
    }
    return 0;
}

Ответы (1 шт):

Автор решения: Harry

А чуть проще не хотите? Так же запоминаем первое появление (по которому потом и сортируем), и счетчик количества. Сортируем, выводим в порядке поступления...

struct item
{
    int count, value, idx;
    item():value(-1),count(0),idx(-1){}
};

int main()
{
    item x[201] = {};
    for(int i = 0; i < 201; ++i) x[i].value = i-100;

    int N;
    cin >> N;
    for(int d, i = 0; i < N; ++i)
    {
        cin >> d;
        if (x[d+100].idx < 0) x[d+100].idx = i;
        x[d+100].count++;
    }

    sort(x,x+201,[](const item& a, const item& b){ return a.idx < b.idx;});

    bool has = false;
    for(int i = 0; i < 201; ++i)
        if (x[i].count > 1) { has = true; cout << x[i].value << " "; }

    if (!has) cout << "NO";
    cout << endl;

}
→ Ссылка