Нужно найти максимальное неповторяющееся число в пользовательском векторе - PullRequest
0 голосов
/ 10 апреля 2019

Я создаю программу, в которой вы вводите количество грибников, они участвуют в конкурсе на сбор мусора, они могут найти shroomA (5 баллов), shroomB (3 балла) и shroomC (15 баллов),Мне нужно найти победителя конкурса и напечатать его / ее имя, но если два или более участника набрали одинаковое количество очков, они дисквалифицируются, то есть мне нужно найти самый высокий неповторяющийся результат.

#include <iostream>
#include <vector>
#include <string>

using namespace std;

class ShroomPicker {
private:
    string name;
    long long int shroomA, shroomB, shroomC;
public:
    void Input() {
        char Name[100];
        long long int shrooma, shroomb, shroomc;
        cin >> Name >> shrooma >> shroomb >> shroomc;
        name = Name;
        shroomA = shrooma; shroomB = shroomb; shroomC = shroomc;
    }

    long long int calcPoints() {
        return shroomA * 5 + shroomB * 3 + shroomC * 15;
    }

    string winnersName() {
        return name;
    }
};

int main() {
    int n;
    cin >> n;

    vector<ShroomPicker> shr;
    for (int i = 0; i < n; i++) {
        ShroomPicker s;
        s.Input();
        shr.push_back(s);
    }
    long long int hiscore = 0;
    int num = 0;

    for (int i = 0; i < n; i++) {
        long long int temp = 0;
        temp = shr[i].calcPoints();
        if (temp > hiscore) {
            hiscore = temp;
            num = i;
        }
    }
    cout << shr[num].winnersName();
    }

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

edit:


for (int i = 0; i < n; i++) {
        long long int temp = 0;
        temp = shr[i].calcPoints();
        if (scoreMap.find(temp) == scoreMap.end()) {
            scoreMap[temp] = Info{ i, false };
        }
        else {
            scoreMap[temp] = Info{ i, true };
        }
    }

Ответы [ 2 ]

0 голосов
/ 10 апреля 2019

Самый быстрый (O (N)) способ, которым я могу придумать, это иметь:

struct Info 
{
int picker_index;
bool disqualified;
} 

// map from score to the Info object above
std::unordered_map<int, Info> scoreMap;

Переберите сборщики и обновите карту следующим образом:

- Если на карте нет элементов, просто добавьте ScoreMap [оценка] = Информация {picker_index, false};

- иначе, установить disqualified = true для существующего элемента;

Как только карта построена, найдите ключ максимума на карте, для которого disqualified = false; похоже на то, что вы делаете сейчас.

0 голосов
/ 10 апреля 2019

Я бы предложил отсортировать список участников по убыванию количества собранных грибов (O [nlogn]), а затем просмотреть список от начала до конца (O [n] max). Первый участник, количество грибов которого выбрано не так, как у соседних участников (в отсортированном списке), становится победителем.

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