코드잼도 하고옴
https://codeforces.com/contest/1330
Dashboard - Codeforces Round #631 (Div. 2) - Thanks, Denis aramis Shitov! - Codeforces
codeforces.com
A. Dreamoon and Ranking Collection
지금까지 내가 한등수를 입력 받는다. 그리고 몇번 더 대회에 참가할건지 입력 받는다. 1등부터 n등까지 모두 하고 싶을때 만족할 수 있는 n의 최대값 찾는 문제이다.
범위가 100이니 완탐 때리면 된다! 해석이 제일 어려웠던 문제
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
|
int arr[MAXN];
int main(void)
{
ios_base::sync_with_stdio(0);
cin.tie(0);
int T;
cin >> T;
while (T--) {
int n,x;
cin >> n >> x;
for (int i = 0; i <= 205; i++) {
arr[i] = 0;
}
for (int i = 1; i <= n; i++) {
int tem;
cin >> tem;
arr[tem] = 1;
}
for (int i = 1; i <= 205; i++) {
if (x == 0 && arr[i] == 0) {
cout << i - 1 << "\n";
break;
}
if(arr[i]==0){
x--;
}
}
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
B. Dreamoon Likes Permutations
입력받은 수 배열을 배열1 과 배열 2로 떨어트리려고 한다. 배엷1과 배열 2는 각각 1~n까지 숫자들을 하나씩 포함해야한다.
처음 배열을 쭉 보면서 각수의 갯수를 che배열에 기록하고 che배열을 다시 쭉 보면서 가능한지 체크한다.
갯수가 2 2 2 2 2 2 1 1 1 1 1 0 0 0이런식이여야지 2 2 2 1 1 2 2 2 1 11 1 1 or 2 2 2 2 1 1 1 0 1 1 1 1 0 0 이런식이면 안된다.
그뒤 앞뒤에서부터 보면서 쪼개준다 끝!
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
int arr[MAXN];
int crr[MAXN];
bool c2[MAXN];
bool c3[MAXN];
int main() {
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int T;
cin >> T;
while (T--) {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> arr[i];
crr[i] = 0;
c2[i]=c3[i]=0;
}
for (int i = 1; i <= n; i++) {
crr[arr[i]]++;
}
int che = 0;
int left=0;
int an = 0;
for (int i = 1; i <= n; i++) {
if (crr[i] != 2) {
an = i - 1;
left = i;
break;
}
}
if (left == 1)
che = 1;
int an2 = 0;
for (int i = left; i <= n ; i++) {
if (crr[i] == 2) {
che=1;
break;
}
else if (crr[i] == 0) {
left = i;
an2 = i - 1;
break;
}
}
for (int i = left; i <= n ; i++) {
if (crr[i]) {
che = 1;
break;
}
}
if (che) {
cout << 0 << '\n';
continue;
}
int cf = 0;
vector<pii> v;
int a1 = an, a2 = an2;
if (a1 + a2 != n) {
cout << 0 << '\n';
continue;
}
left = 0;
int midche = 0;
for (int i = 1; i <= a1; i++) {
if (c2[arr[i]] == 0) {
c2[arr[i]] = 1;
}
else {
midche = 1;
}
}
for (int i = a1+1; i <= n; i++) {
if (c3[arr[i]] == 0) {
c3[arr[i]] = 1;
}
else {
midche = 1;
}
}
if (midche == 0) {
v.push_back({ a1, a2 });
}
for (int i = 1; i <= a1; i++) {
c2[arr[i]] = 0;
}
for (int i = a1 + 1; i <= n; i++) {
c3[arr[i]] = 0;
}
midche = 0;
if (a1 == a2)
midche = 1;
for (int i = 1; i <= a2; i++) {
if (c2[arr[i]] == 0) {
c2[arr[i]] = 1;
}
else {
midche = 1;
}
}
for (int i = a2 + 1; i <= n; i++) {
if (c3[arr[i]] == 0) {
c3[arr[i]] = 1;
}
else {
midche = 1;
}
}
if (midche == 0) {
v.push_back({ a2, a1 });
}
if (v.size() == 0) {
cout << 0 << '\n';
continue;
}
cout << v.size()<<'\n';
for (int i = 0; i < v.size(); i++) {
cout << v[i].first << ' ' << v[i].second << '\n';
}
}
}
|
C. Dreamoon Likes Coloring
문제가 읽어보면 범위가 아주 욕나오게 복잡하지만 잘보면 그냥 각 색을 l1,l2,,,,lm의 길이만큼 칠할수 있는곳에 칠하겠다는 거다.
T1은 결국 3칸칠하고 2칸칠하고 2칸 칠한다는뜻
1)모든칸을 중복 없이 칠했을때의 길이가 전체 길이보다 짧으면 탈락(12줄)
2)1번색은 1칸 2번색은 2칸부터 칠할때 즉 최소로 칠할때 전체길이보다 길면 탈락(16줄)
3) 1과 2를 만족하므로 2의 gap만큼 중간에 띄워주면 완성! 25줄
최소 한번씩은 칠해줘야함
주의할점 ! n번색을 n칸부터 칠할때 마지막 칠할점이 n보다 크면 안됨! 이거때문에 3번틀림 개가튼..
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
|
ll arr[MAXN];
int main() {
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
ll n, m;
cin >> n >> m;
ll snum = 0;
for (int i = 1; i <= m; i++) {//l칸씩 칠 하겠다.
cin >> arr[i];
snum += arr[i];
}
if (snum < n) {
cout << -1;
return 0;
}
if (m - 1 + arr[m] > n) {
cout << -1;
return 0;
}
ll gap = n - (m - 1 + arr[m]);
int whi = n-arr[m]+1;
vector<int> v;
v.push_back(whi);
int che = 0;
for (int i = m-1; i >= 1; i--) {
whi--;
if (gap >= arr[i] - 1) {
gap -= arr[i] - 1;
whi -= arr[i] - 1;
}else if (gap < arr[i] - 1) {
whi -= gap;
gap = 0;
}
if (whi + arr[i] - 1 > n)
che = 1;
v.push_back(whi);
}
if (che) {
cout << -1;
return 0;
}
for (int i = m-1; i >= 0; i--)
cout << v[i] << ' ';
}
|
'알고리즘 > 대회' 카테고리의 다른 글
Codeforces Round #633 (Div. 2) 코드포스 #633 (0) | 2020.04.13 |
---|---|
Codeforces Round #632 (Div. 2) 코드포스 후기 (0) | 2020.04.10 |
Codeforces Round #630 (Div. 2) 민트의 왕이라네~ (0) | 2020.04.01 |
Codeforces Round #629 (Div. 3) 블루 달성! (0) | 2020.03.29 |
Educational Codeforces Round 84 (Rated for Div. 2) (0) | 2020.03.25 |