https://www.acmicpc.net/problem/24025
돌의 정령의 무리의 키가 4 1 5 2 3 이라면 왼쪽수터 시야 점수는 2 0 INF 0 INF 가 된다. 자신의 무리보다 키가 큰 무리 전까지의 돌의 정령 무리 수가 시야 점수가 된다.
문제에서 돌의 정령 무리수와 동일한 개수만큼의 숫자가 주어진다. 주어진 숫자가 A(A>0)일 경우 해당 숫자가 주어진 인덱스의 돌의 정령의 시야점수가 A이상이 되도록, 주어진 숫자가 -A(-A<0)일 경우는 해당 숫자가 주어진 인덱스의 돌의 정령의 시야점수가 A이하가 되도록 1~N까지의 돌의 정령을 배치하라는 문제이다.
★Point
1. 마지막에 배치되는 돌의 정령의 시야점수는 항상 INF이다.
2. 돌의 정령의 무리가 N~1까지 내림차순으로 배치되면, 모든 돌의 정령의 무리의 시야점수는 INF이다.
돌의 정령의 시야점수가 딱 A가 되게 만드는 것이 아니라 A이상 -A이하로 만들어도 되기 때문에 돌의 정령을 내림차순으로 배열하여 시야를 INF로 만들고 후에 -A인 부분을 처리하는 식으로 생각하면 된다.
처리는 내림차순으로 배치한 후에 배열A에서 음수인 부분의 인덱스와 다음 인덱스의 원소까지 reverse를 해주면 된다.
그럼 음수인 부분의 돌의정령은 시야가 항상 0이 되서 조건을 만족시킨다.
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int n, arr[70001], stone[70001];
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin >> n;
for(int i = 1; i <= n; i++){
cin >> arr[i];
stone[i] = n+1-i;
}
int idx = 1;
bool flag = true, check = false;
vector<int> negatives;
while(idx <= n){
if(arr[idx] < 0){
if(idx == n) flag = false;
negatives.push_back(idx);
check = true;
idx++;
continue;
}
if(!check) {
idx++;
continue;
}
negatives.push_back(idx);
int start = negatives[0], end = negatives.back();
reverse(stone+start, stone+end+1);
negatives.clear();
check = false;
idx++;
}
if(flag){
for(int i = 1; i <= n; i++) cout << stone[i] << " ";
}
else cout << -1;
}
+코드포스 스타일의 문제(구성적)
++돌의 정령은 매우 귀엽담.
'📚알고리즘 > 백준' 카테고리의 다른 글
[백준 2655번] 가장높은탑쌓기 (C++) (0) | 2024.07.18 |
---|---|
[백준 31443번] 준영이 (C++) (0) | 2024.07.17 |
[백준 7561번] 크래머의 공식 (C++) (0) | 2024.07.06 |
[백준 31404번] 아리스, 청소합니다! (Easy) (C++) (0) | 2024.07.03 |
[백준 2206번] 벽 부수고 이동하기 (C++) (0) | 2024.07.03 |