Сортировка по нескольким атрибутам - PullRequest
0 голосов
/ 23 октября 2018

моя задача

1) по количеству решенных задач в порядке убывания

2) при количестве решенных задач - по времени штрафа в порядке возрастания

3) Когда количество выполненных заданий и время штрафа равны - по показателям команд в порядке возрастания.

файл ввода будет выглядеть так:

Первая строка содержитнатуральное число n (1 ≤ n≤105) - количество команд, участвующих в конкурсе.

В следующих n строках содержатся два числа S - количество решенных задач (0 ≤ S ≤ 100) и штрафвремя T (1 ≤ T ≤ 1000000) i-й команды.

Пример:

6

3 50

5 720

1 7

0 0

8 500

8 500

, поэтому выходной файл будет:

5 6 2 1 3 4

#include <iostream> 
using namespace std;

void swap(int *xp, int *yp)
{
    int temp = *xp;
    *xp = *yp;
    *yp = temp;
}

void printArray(int A[],int B[], int size)
{
    int i,xx;
    for (i = size-1; i >= 0; i--) {
        for (int x = 0; x < size; x++) {
            if (A[i] == B[x]) {
                cout << x+1 << " ";
                //break;
            }
        }

    }


}
int main()
{

    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);

    int qarray, largest;

    cin >> qarray;
    int *task = new int[qarray];
    int *newtask = new int[qarray];
    int *time = new int[qarray];
    for (int i = 0; i < qarray; i++)
    {
        cin >> task[i];
        cin >> time[i];
    }

    for (int i = 0; i <= qarray - 1; i++) {
        newtask[i] = task[i];
    }

    int i, j;
    for (i = 0; i < qarray - 1; i++) {

    // Last i elements are already in place    
        for (j = 0; j < qarray - i - 1; j++) {
            if (task[j] > task[j + 1]) {
            swap(&task[j], &task[j + 1]);
        }
        }

}

    printArray(task, newtask,qarray);


    return 0;

}

Короче, я полностью застрял

1 Ответ

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

Стандартное решение для библиотеки (вы можете заменить std :: sort на собственную функцию сортировки):

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


struct Team
{
   std::uint32_t number;
   std::uint32_t quantity;
   std::uint32_t penalty;

   bool operator < (const Team& other) const
   {
       bool isEqQuantity = quantity == other.quantity;
       bool isEqPenalty  = penalty == other.penalty;

       return quantity > other.quantity 
           || (isEqQuantity && penalty < other.penalty)
           || (isEqQuantity && isEqPenalty && number < other.number);
   }
};


int main()
{
    std::vector<Team> teams;

    //Read teams from file
    //....

    //Or use other sort
    std::sort(teams.begin(), teams.end(), [](const Team& t1, const Team& t2)
    {
        return t1 < t2;
    });

    for (auto& t : teams)
    {
        std::cout << t.number << " ";
    }

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