-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path1604.cpp
69 lines (66 loc) · 2.29 KB
/
1604.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <bits/stdc++.h>
/**
* Отсортируем массив.
* Каждый раз будем работать с двумя максимальными по количеству элементами.
* Каждый раз выводим первые 2 знака, уменьшаем сумму знаков этих типов.
* В случае, если количество знаков в первых 2 элементах массива больше не максимальное
* восстанавливаем упорядоченность массива, перемещая эти элементы в правильное место.
*
* Таким образом мы каждый раз ставим разные знаки до тех пор, пока не остануутся знаки одного типа,
* для которых нельзя поставить пару.
*/
bool comp(std::pair<int, int> a, std::pair<int, int> b) {
return a.second > b.second;
}
int main() {
std::pair<int, int> p[10000];
int n;
std::cin >> n;
int sum = 0;
for (int i = 0; i < n; ++i) {
std::cin >> p[i].second;
sum += p[i].second;
p[i].first = i + 1;
}
sort(p, p + n, comp);
while (sum--) {
std::cout << p[0].first << " ";
p[0].second--;
if (p[1].second != 0) {
std::cout << p[1].first << " ";
p[1].second--;
}
int j = 1, k = 2;
while (p[j].second < p[k].second) {
int t = p[j].second;
p[j].second = p[k].second;
p[k].second = t;
t = p[j].first;
p[j].first = p[k].first;
p[k].first = t;
k++;
j++;
if (k == n) {
break;
}
}
j = 0, k = 1;
while (p[j].second < p[k].second) {
int t = p[j].second;
p[j].second = p[k].second;
p[k].second = t;
t = p[j].first;
p[j].first = p[k].first;
p[k].first = t;
k++;
j++;
if (k == n) {
break;
}
}
if (p[0].second <= 0) {
return 0;
}
}
return 0;
}