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
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
 
int Answer;
int n;
int k;
int main(int argc, char** argv)
{
    int T, test_case;
 
 
 
    cin >> T;
    for (test_case = 0; test_case < T; test_case++)
    {
        cin >> n >> k;
        vector<int> arr(n);
        for (int i = 0; i < n; i++) {
            cin >> arr[i];
        }
        sort(arr.begin(), arr.end());
        Answer = 0;
        for (int pos = 0; pos < n; pos++) {
            if (arr[pos] - arr[pos - Answer] > k) {
                continue;
            }
            else {
                Answer++;
            }
        }
 
        cout << "Case #" << test_case + 1 << endl;
        cout << Answer << endl;
    }
 
    return 0;
}
cs

출처:https://www.codeground.org/practice/practiceProblemViewNew


1.문제를 처음풀때 그냥 제일 최솟값을 구해서 현재 위치-최솟값>k이면 다 같은 버스를 태워야지 이런 식으로 문제를 풀었는데

생각 해보니 같은버스에 전부다 태우면 최솟값 제외한 친구들도 고려를 해줘야 해야되는걸 생각하지 못했습니다.

2.정렬시키고 각자 다 다른 버스에 태우기 위해 버스의 대수를 고려서 문제를 풀어 줬습니다. 

1 3 4 7 8 의 경우를 보면 7,8의 경우는 서로 다른 버스에 타야합니다. 

그 조건을 만족시키기위해서  arr[pos] - arr[pos - Answer] 라는 조건을 써줬습니다.

Answer는 현재보유하고있는 버스의 수를 의미합니다.

처음에 long long을 사용해서 문제를 풀었는데 숫자가 10억이니 int형을 사용해도 잘 풀리네요. 

int형은 약 20억이상이면 범위 오류가 난다고 합니다. 


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

scpc Practice 회문인 수의 합  (0) 2019.07.10

+ Recent posts