ამოხსნების სტატუსი

ამ გვერდზე თქვენ იხილავთ გაგზავნილი ამოხსნების სტატუსს.


გაგზავნის თარიღი: 16.11.2019 12:50:07

ამოცანა: რიცხვი

მომხმარებელი: Periaraperi

ვერდიქტი: სრული ამოხსნა

შეფასება: 100.0 ქულა







#include <iostream>
#include <stdio.h>
#include <vector>
#include <set>
#include <deque>
#include <cmath>
#include <algorithm>
#include <utility>
#include <stack>

int main()
{
    std::string num; std::cin >> num; // 313220
    std::string prevnum = num; // we will change num later so store initial num here

    //find next min number greater than first element
    int first = num[0]-'0';
    int nextMin = 0, minIndex;
    int k = 0, j = 1;
    while (k < (9-first)){ // number of tests required depends on first element
        for (int i = 0; i < num.size(); ++i){
            if ((num[i]-'0') == (num[0]-'0')+j){
                nextMin = num[i]-'0';
                minIndex = i;
                goto exitLoops1; // if min was found exit from loops
            }
        }
        ++k;
        ++j; // if num[0]+1 does not exist test num[0]+2 ...
    }
    exitLoops1:

    for (int i = num.size()-1, k = 1; i >= 1; --i,++k){
        if (i == 1){
        // for last case: if only second element is greater than first
            if ((num[1]-'0') > (num[0]-'0') && nextMin != 0){
            // swap first element with nextMin element and sort all elements after first in increasing order
                int x = num[0] - '0';
                num[0] = nextMin + '0';
                num[minIndex] = x + '0';
                sort(num.begin()+1,num.end());
                break;
            }
        }else{
        // see if element is greater than any of the previous elements except first, k sets maxValue of j
        // that is how many elements should we check before num[i]
            for (int j = 1; j < num.size()-k; ++j){
                if (num[i]-'0' > num[i-j]-'0'){ // if yes
                    std::swap(num[i],num[i-j]); // swap them
                    sort(num.begin()+(i-j+1),num.end()); // and sort all elements after num[i-j]
                    goto exitLoops2; // exit from loops
                }
            }
        }
    }

    exitLoops2:
    if (num == prevnum) std::cout << 0;
    else std::cout << num;
}

ტესტები

შემავალი მონაცემები
999999
გამომავალი მონაცემები
0
თქვენი პასუხი
0
ჩეკერის პასუხი
YES
შემავალი მონაცემები
38
გამომავალი მონაცემები
83
თქვენი პასუხი
83
ჩეკერის პასუხი
YES
შემავალი მონაცემები
818
გამომავალი მონაცემები
881
თქვენი პასუხი
881
ჩეკერის პასუხი
YES
შემავალი მონაცემები
51559
გამომავალი მონაცემები
51595
თქვენი პასუხი
51595
ჩეკერის პასუხი
YES
შემავალი მონაცემები
313220
გამომავალი მონაცემები
320123
თქვენი პასუხი
320123
ჩეკერის პასუხი
YES