알고리즘 모음(C++)

백준 31848- 엉성한 도토리 분류(C++) 본문

백준

백준 31848- 엉성한 도토리 분류(C++)

공대생의 잡다한 사전 2024. 5. 26. 14:27
문제 링크입니다. https://www.acmicpc.net/problem/31848

 

도토리를 구멍이 있는 분류기에 굴렸을 때, 몇번 째 구멍에서 빠지는지 구하는 문제입니다.

못빠지는 분류기를 지날 때마가 도토리의 크기는 1씩 작아집니다.

 

따라서 먼저 뒤에 있는 분류기에 위치 값을 더해주면서 어느 정도의 도토리까지 통과할 수 있는지를 구했습니다.

 

구멍의 크기를 갱신했으면, N번 째 도토리의 크기까지 몇번 째 구멍에서 먼저 빠지는지를 저장해줬습니다.

 

도토리의 크기를 입력 받았으면, 이전에 저장해두었던 값을 통해서 몇번 째 구멍에서 빠지는지 출력해줍니다.

(이분 탐색도 가능합니다.) 

 

자세한 것은 코드를 참고해주세요.

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <queue>
#include <cmath>
#include <cstring>

using namespace std;
int N, M;
pair<int, int> hole[100001];
int dotori[100001];
int Where[100001];
vector<int> ans;

void solve() {
	int fin = 0;
	for (int i = 1; i <= N; i++) {
		if (hole[i].first <= fin) continue;
		if (Where[N] != 0) break;
		for (int j = fin; j <= min(hole[i].first, N); j++) {
			if (Where[j] == 0) {
				Where[j] = hole[i].second;
			}
		}
		fin = hole[i].first;
	}
	for (int i = 1; i <= M; i++) cout << Where[dotori[i]] << " ";
}

int main() {
	cin.tie(0);
	cout.tie(0);
	cin >> N;
	for (int i = 1; i <= N; i++) {
		scanf("%d", &hole[i].first);
		hole[i].first += (i - 1);
		hole[i].second = i;
	}
	cin >> M;
	for (int i = 1; i <= M; i++) scanf("%d", &dotori[i]);
	solve();
	return 0;
}

 

 

질문 및 조언은 댓글을 남겨주세요.

'백준' 카테고리의 다른 글

백준 31854 - 부등호 퍼즐(C++)  (0) 2024.05.26
백준 31849 - 편세권(C++)  (0) 2024.05.26
백준 31846 - 문자열 접기(C++ )  (0) 2024.05.26
백준 31845 - 카드 교환(C++)  (0) 2024.05.26
백준 31844 - 창고지기(C++)  (0) 2024.05.26