문제 링크입니다: https://www.acmicpc.net/problem/10899
10899번: King of penalty
어느 날 재의는 기묘한 대회에 참가하게 되었다. 그 이름은 King of penalty! 이 대회는 ICPC와 거의 비슷한 대회인데, 세부적인 규칙은 다음과 같다. 대회는 P분 동안 진행된다. 가장 처음의 페널티 수치는 0이며, 1분이 지날 때마다 1씩 증가한다. 문제를 제출하여 맞추게 되면, 그 문제의 페널티는 소스 제출한 시간의 페널티 수치가 된다. 제출 횟수는 상관없다. 문제를 풀지 않으면 페널티는 0이다. 총 페널티는 모든 문제의 페널티를 더한 값
www.acmicpc.net
그리디하게 접근하면 되는 문제였습니다.
패널티가 가장 크게 잡히기 위해서는 정확히 (P - 1)분에 마지막 문제를 제출해야합니다.
또한, 처음 푸는 문제가 소요되는 시간이 제일 길어야하고 마지막 푸는 문제에 소요되는 시간이 제일 짧아야한다는 것도 알 수 있습니다.
최대한 많은 문제를 풀면서 가장 많은 페널티를 얻는 것이 목표이기 때문에
우리는 (P - 1)분부터 역으로 문제 풀이에 소요되는 시간이 작은 순부터 빼가면서 더해나가면 됩니다.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#include <vector> | |
#include <algorithm> | |
using namespace std; | |
typedef struct | |
{ | |
long long duration; | |
int cnt; | |
} Result; | |
int main(void) | |
{ | |
ios_base::sync_with_stdio(0); | |
cin.tie(0); | |
int P, N; | |
cin >> P >> N; | |
vector<int> durations(N); | |
for (int i = 0; i < N; i++) | |
{ | |
cin >> durations[i]; | |
} | |
sort(durations.begin(), durations.end()); | |
int sum = 0; | |
int timeLimit = P - 1; | |
Result result = { 0, 0 }; | |
for (int i = 0; i < N && timeLimit >= durations[i]; i++) | |
{ | |
result.duration += timeLimit; | |
timeLimit -= durations[i]; | |
result.cnt++; | |
} | |
cout << result.cnt << " " << result.duration << "\n"; | |
return 0; | |
} |


개발환경:Visual Studio 2017
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
반응형
'알고리즘 > BOJ' 카테고리의 다른 글
백준 10994번 별 찍기 - 19 (0) | 2020.04.08 |
---|---|
백준 10993번 별 찍기 - 18 (0) | 2020.04.07 |
백준 16198번 에너지 모으기 (0) | 2020.04.07 |
백준 2980번 도로와 신호등 (2) | 2020.04.04 |
백준 4796번 캠핑 (0) | 2020.03.28 |