Шифровка чисел с++
Всем доброго времени суток! Задача заключается в том чтобы каждое число из перестановки чисел от 1 до n было заменено количеством чисел, больших него и находящихся правее в последовательности. Вводится одно целое число n и n зашифрованных чисел. Нужно вывести искомую последовательность (перестановку). Например, если вводится n=3, то это числа от 1 до 3. Если расшифровать последовательность нельзя, вывести «Impossible». Пример:
ввод:
3
2 1 0
вывод:
1 2 3 (2=1, тк 2 числа больше единицы, 1=2, тк 1 число больше двойки, 0=3, тк нет чисел в последовательности до 3х больших тройки)
Я не знаю в чем моя ошибка, помогите пожалуйста разобраться
#include <iostream>
#include <vector>
int main() {
int n;
std::cin >> n;
std::vector<int> encrypted(n);
for (int i = 0; i < n; ++i) {
std::cin >> encrypted[i];
}
std::vector<int> decrypted(n, -1);
for (int i = 0; i < n; ++i) {
int count = 0;
for (int j = 0; j < n; ++j) {
if (decrypted[j] == -1 && count == encrypted[i]) {
decrypted[j] = i + 1;
break;
}
if (decrypted[j] == -1) {
count++;
}
}
}
bool impossible = false;
for (int i = 0; i < n; ++i) {
if (decrypted[i] == -1) {
impossible = true;
break;
}
}
if (impossible) {
std::cout << "Impossible" << std::endl;
} else {
for (int i = 0; i < n; ++i) {
std::cout << decrypted[i] << " ";
}
}
return 0;
}
Ответы (1 шт):
Автор решения: Harry
→ Ссылка
Ну, я бы делал как-то так:
#include <deque>
#include <iostream>
using namespace std;
int main(int argc, char * argv[])
{
int n;
cin >> n;
deque<int> r, d;
bool imps = false;
for (int i = 0; i < n; ++i) d.push_back(i+1);
for (int j, i = 0; i < n; ++i)
{
cin >> j;
j = n-i-1-j;
if (j >= d.size()) { imps = true; break; }
r.push_back(d[j]);
d.erase(d.begin()+j);
}
if (imps) cout << "Impossible";
else for(int i: r) cout << i << " ";
cout << endl;
}