본문 바로가기
Algorithm/문제 풀이 (Problem Solving)

[C++] 코드그라운드 연습문제 프로그래밍 경진대회 문제풀이

by matters_ 2019. 6. 19.

문제링크

코드그라운드 연습문제 프로그래밍 경진대회

 

codeground

Codeground is a real-time coding website open to those interested in software development and algorithms.

www.codeground.org

간단하지만 효율적인 알고리즘이 잘 떠오르지 않는 문제이다. 문제에서 각 라운드 마다 받은 점수의 합이 제일 높은 사람이 우승한다고 하였는데 이는 우승자가 여러명일 수도 있다는 이야기이다. 이 조건이 이해가 되지 않아 질문이 많은 문제이다.

구하려는 것은 우승이 가능한 사람의 수이므로 각 점수에다 최대치(N)를 더한 점수가 어떤 기준점수를 넘는지 안넘는지 판단하면 된다. 여기서 기준점수는 다른 모든 점수들을 최저로 만든뒤 그 점수들 중 최고인 점수이다. 

따라서 이전 라운드까지의 점수에서 최대치(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
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
 
int Answer,n;
 
 
int main(int argc, char** argv)
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int T, test_case;
 
 
    cin >> T;
    for(test_case = 0; test_case  < T; test_case++)
    {
        int max=0;
        Answer = 0;
 
        cin>>n;
        vector <int> scores(n,0);
        for(int i=0;i<n;i++cin>>scores[i];
       
 
        //정렬하고
        sort(scores.begin(),scores.end());
        
 
        //최저후보점수의 최대값을 구한뒤
        for(int i=0;i<n;i++){
            int tmep=scores[i]+n-i;
            if(max<tmep)max=tmep;
        }
    
        //각 점수와 비교해 최대값이상이면 우승할 가능성이 있는 후보이므로 정답을 증가 
        for(int i=0;i<n;i++){
            if(scores[i]+n>=max)Answer++;
        }
 
 
        cout << "Case #" << test_case+1 << endl;
        cout << Answer << endl;
    }
 
    return 0;
}

cs

간단하지만 간단하지 않은 문제이다. 최저가 될 수 있는 후보점수들의 최대값을 구한다는 아이디어가 중요하다. 

 

댓글