티스토리 뷰

알고리즘/BOJ

[백준] 10800 컬러볼

세진짱 2020. 2. 5. 16:33

 

쉬운 문제라고 생각해서 풀었는데 틀렸다

그리고 계속 생각도 거꾸로해서 방법을 못떠올렸다

 

문제는 자기와 색이 다르고 나보다 작은공을 먹을 수 있다는 내용이다

 

문제를 보고 거꾸로 생각했다 

미리 합을 다 구해두고 크기를 기준으로 거꾸로 정렬해서

현재 나의 크기의 합들과 나의 색들의 합들을 빼야지했는데

두개의 교집합 부분을 다시 더해주기가 힘들어서 못했다

 

찾아보니 완전 거꾸로 생각하고있었다

반대로가면 쉽다

 

내가 여태까지 본 크기의 집합들과 색의 집합들을 가져가면 오히려 쉽다

크기를 기준으로 오름차순 정렬을하면 나는 다음 볼에 영향을 주는 볼이다

 

결국 생각해보면

현재 볼 = (여태까지의 합) - (같은 수의 크기 합) - ( 같은 크기의 크기 합) + 내크기

이렇게 하면 된다

 

집합이라고 생각하니 그림이 그려진다

 

근데 처리할게있다 이전게 나와 크기도 색도 같다면 답이 같아야한다!

 

소스코드

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
#include <iostream>
#include <algorithm>
using namespace std;
int n;
int C[200020],S[2020];
pair<pair<intint>int> arr[200020];
int ans[200020];
 
int main() {
    scanf(" %d"&n);
    for (int i = 0; i < n; i++) {
        int w, c; scanf(" %d %d"&c, &w);
        arr[i] = { {w,c-1},i };
    }
    sort(arr, arr + n);
    int sum = 0;
    
    for (int i = 0; i < n; i++) {
        int weight = arr[i].first.first;
        int color = arr[i].first.second;
        int idx = arr[i].second;
 
 
        C[color] += weight;
        S[weight] += weight;
        sum += weight;
 
        ans[idx] = sum - C[color] - S[weight] + weight;
        if (i != 0 && weight == arr[i - 1].first.first && color == arr[i - 1].first.second) 
            ans[idx] = ans[arr[i - 1].second];
    }
    for (int i = 0; i < n; i++printf("%d\n", ans[i]);
}
 
 

 

'알고리즘 > BOJ' 카테고리의 다른 글

[백준] 12919 A와 B 2  (0) 2020.02.07
[백준] 12945 재미있는 박스 정리  (0) 2020.02.05
[백준] 1445 일요일 아침의 데이트  (0) 2020.02.05
[백준] 17472 다리 만들기 2  (0) 2020.02.05
[백준] 2502 떡 먹는 호랑이  (1) 2020.02.04
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/12   »
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
글 보관함