4875 2023. 04. 05 20:31:16 CWM Következő permutáció (50 pont) cpp17 Elfogadva 50/50 4ms 4904 KiB
#include <iostream>
#include <vector>
#include <climits>
#include <algorithm>
#include <unordered_set>
#include <queue>

//upper bound >
//lower bound >=
//int index = (lower_bound(testvec.begin(), testvec.end(), num)-testvec.begin());

using namespace std;
using ll = long long;
int mod = 1000000007;

signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);

    int n;
    cin >> n;
    vector<int> startingList;
    for (size_t i = 0; i < n; i++)
    {
        int a;
        cin >> a;
        startingList.push_back(a);
    }
    for (size_t i = 0; i < n - 1; i++)
    {
        if (startingList[n - i - 1] > startingList[n - i - 2]) {
            vector<int> ToSort;
            int begin = n - i - 2;
            for (size_t j = begin; j < n; j++)
            {
                ToSort.push_back(startingList[j]);
            }
            sort(ToSort.begin(), ToSort.end());
            int index = (upper_bound(ToSort.begin(), ToSort.end(), startingList[begin]) - ToSort.begin());
            vector<int> alrSorted;
            for (size_t j = 0; j < ToSort.size(); j++)
            {
                if (j != index) {
                    alrSorted.push_back(ToSort[j]);
                }
            }
            startingList[begin] = ToSort[index];
            for (size_t j = 0; j < alrSorted.size(); j++)
            {
                startingList[begin + 1 + j] = alrSorted[j];
            }
            break;
        }
    }
    // Found next iteration, is it correct though?
    int max = -1;
    int secMax = -1;
    int issueIndex = -1;
    vector<int> ToSort;
    for (int i = startingList.size() - 1; i >= 0; i--)
    {
        if (startingList[i] > max) {
            if (secMax != -1) {
                issueIndex = i;
                break;
            }
            else {
                max = startingList[i];
            }
        }
        else if (secMax == -1) {
            secMax = startingList[i];
        }
        else if (startingList[i]<secMax) {
            max = secMax;
            secMax = startingList[i];
        }
    }
    if (issueIndex == -1) {
        for (size_t i = 0; i < n; i++)
        {
            cout << startingList[i] << " ";
        }
        return 0;
    }
    for (size_t j = issueIndex + 1; j < n; j++)
    {
        ToSort.push_back(startingList[j]);
    }
    sort(ToSort.begin(), ToSort.end());
    int largerThanIssueIndex = (upper_bound(ToSort.begin(), ToSort.end(), startingList[issueIndex]) - ToSort.begin());
    vector<int> AlrSorted;
    for (size_t i = 0; i < largerThanIssueIndex; i++)
    {
        AlrSorted.push_back(ToSort[largerThanIssueIndex - 1 - i]);
    }
    for (size_t i = largerThanIssueIndex; i < ToSort.size(); i++)
    {
        AlrSorted.push_back(ToSort[i]);
    }
    for (size_t i = issueIndex + 1; i < n; i++)
    {
        startingList[i] = AlrSorted[i - issueIndex - 1];
    }
    for (size_t i = 0; i < n; i++)
    {
        cout << startingList[i] << " ";
    }
    return 0;
}
Részfeladat Összpont Teszt Verdikt Idő Memória
base 50/50
1 Elfogadva 0/0 3ms 1828 KiB
2 Elfogadva 0/0 4ms 2216 KiB
3 Elfogadva 1/1 3ms 2232 KiB
4 Elfogadva 1/1 3ms 2444 KiB
5 Elfogadva 1/1 3ms 2656 KiB
6 Elfogadva 1/1 3ms 2756 KiB
7 Elfogadva 2/2 3ms 2968 KiB
8 Elfogadva 2/2 3ms 3064 KiB
9 Elfogadva 2/2 2ms 3048 KiB
10 Elfogadva 2/2 2ms 3048 KiB
11 Elfogadva 1/1 3ms 3288 KiB
12 Elfogadva 1/1 2ms 3268 KiB
13 Elfogadva 1/1 3ms 3392 KiB
14 Elfogadva 1/1 2ms 3476 KiB
15 Elfogadva 3/3 3ms 3752 KiB
16 Elfogadva 3/3 3ms 3872 KiB
17 Elfogadva 3/3 3ms 4092 KiB
18 Elfogadva 3/3 3ms 4144 KiB
19 Elfogadva 3/3 4ms 4188 KiB
20 Elfogadva 3/3 4ms 4456 KiB
21 Elfogadva 3/3 4ms 4576 KiB
22 Elfogadva 3/3 4ms 4664 KiB
23 Elfogadva 3/3 4ms 4884 KiB
24 Elfogadva 3/3 4ms 4868 KiB
25 Elfogadva 2/2 4ms 4904 KiB
26 Elfogadva 2/2 4ms 4788 KiB