https://www.acmicpc.net/problem/14864

 

순서쌍 (x, y)는 학생y 가 학생x 보다 뒤에 있으면서 더 작은 번호를 가지고 있다는 것을 의미하며,

입력으로 주어지는 순서쌍을 제외하면 더 작은 번호를 갖고있는 학생은 무조건 앞에 있다는 뜻이 됩니다.

 

그러면 최초 입력을 받기 전에는 1 ~ N번째 학생은 1 ~ N번을 순서대로 들고있게 됩니다.

그리고 입력되는 (x, y)에서 x는 본인보다 뒤에 있는 y보다 큰 수를 갖고 있으므로 +1으로 카운팅할 수 있습니다.

반대로 y는 -1으로 카운팅할 수 있습니다.

 

그렇게 수정된 배열에는 학생들이 들고있는 번호가 완성되지만 중복이 포함될 수 있습니다.

그런 경우에는 -1을 출력해주시고, 그렇지 않다면 1 ~ N번 학생의 번호를 순서대로 출력해줍니다.

 

 

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
#include <iostream>
#define MAX 100001
using namespace std;
 
int list[MAX];
bool chk[MAX];
int N, M;
 
void init() {
    for (int i = 1; i <= N; i++) {
        list[i] = i;
    }
}
 
void func() {
    for (int i = 1; i <= N; i++) {
        if (chk[list[i]]) {
            cout << "-1\n";
            return;
        }
        chk[list[i]] = true;
    }
 
    for (int i = 1; i <= N; i++) {
        cout << list[i] << ' ';
    }
    cout << '\n';
}
 
void input() {
    int x, y;
    cin >> N >> M;
    init();
    while (M--) {
        cin >> x >> y;
        list[x]++;
        list[y]--;
    }
}
 
int main() {
    cin.tie(NULL); cout.tie(NULL);
    ios::sync_with_stdio(false);
 
    input();
    func();
 
    return 0;
}
cs

'algorithm > ad-hoc' 카테고리의 다른 글

boj 10350 Banks  (0) 2024.07.31
boj 5527 전구 장식  (0) 2024.07.30
boj 2381 최대 거리  (0) 2024.07.25
boj 14675 단절점과 단절선  (0) 2024.07.23
boj 27468 2배 또는 0.5배  (0) 2024.07.22

https://www.acmicpc.net/problem/2381

 

두 점의 좌표 (a, b), (c, d)가 있을 때 L1-metric 거리는 |a - c| + |b - d| 이라고 하고 L1-metric의 최댓값을 구하는 문제입니다.

우선 절댓값부터 전개를 하면

1. (a + b) - (c + d)

2. - (a + b) + (c + d)

3. (a - b) - (c - d)

4. - (a - b) + (c - d)

이렇게 되는것을 알 수 있습니다.

 

여기서 (1, 2), (3, 4)를 묶어서 보면 각각 x + y, x - y의 차이를 계산하고 있습니다.

그렇다면 x + y, x - y를 배열에 각각 넣고 정렬해서 최대 - 최소를 구한다면 답을 구할 수 있습니다.

이 때 x + y의 최대 - 최소, x - y의 최대 - 최소 중 max를 출력합니다.

 

 

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
#include <iostream>
#include <algorithm>
#define MAX 50001
using namespace std;
 
int list[2][MAX];
int N;
 
void func() {
    sort(list[0], list[0+ N);
    sort(list[1], list[1+ N);
    cout << max(list[0][N - 1- list[0][0], list[1][N - 1- list[1][0]) << '\n';
}
 
void input() {
    int x, y;
    cin >> N;
    for (int i = 0; i < N; i++) {
        cin >> x >> y;
        list[0][i] = x + y;
        list[1][i] = x - y;
    }
}
 
int main() {
    cin.tie(NULL); cout.tie(NULL);
    ios::sync_with_stdio(false);
 
    input();
    func();
 
    return 0;
}
cs

'algorithm > ad-hoc' 카테고리의 다른 글

boj 5527 전구 장식  (0) 2024.07.30
boj 14864 줄서기  (0) 2024.07.26
boj 14675 단절점과 단절선  (0) 2024.07.23
boj 27468 2배 또는 0.5배  (0) 2024.07.22
boj 1377 버블 소트  (0) 2024.06.07

+ Recent posts