분류 - 그리디 알고리즘
문제
지민이는 항구에서 일한다. 그리고 화물을 배에 실어야 한다. 모든 화물은 박스에 안에 넣어져 있다. 항구에는 크레인이 N대 있고, 1분에 박스를 하나씩 배에 실을 수 있다. 모든 크레인은 동시에 움직인다.
각 크레인은 무게 제한이 있다. 이 무게 제한보다 무거운 박스는 크레인으로 움직일 수 없다. 모든 박스를 배로 옮기는데 드는 시간의 최솟값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에는 각 크레인의 무게 제한이 주어진다. 이 값은 1,000,000보다 작거나 같다. 셋째 줄에는 박스의 수 M이 주어진다. M은 10,000보다 작거나 같은 자연수이다. 넷째 줄에는 각 박스의 무게가 주어진다. 이 값도 1,000,000보다 작거나 같은 자연수이다.
출력
첫째 줄에 모든 박스를 배로 옮기는데 드는 시간의 최솟값을 출력한다. 만약 모든 박스를 배로 옮길 수 없으면 -1을 출력한다.
예제 입력 1 복사
3
6 8 9
5
2 5 2 4 7
예제 출력 1 복사
2
1. 크레인 sort , greater
2. 박스 sort , greater
3. 만약 크레인[0] - box[0]이 0보다 작으면 -1을 출력한다 아니면 밑에 부분 실행
4. while문으로 box vector가 empty가 아닐 때 계속 루프가 돌게한다.
5. 크레인의 크기만큼 for문 돌리고 이중 for문으로 박스의 크기만큼 for문을 돌린다
6. 만약 크레인[i]의 값 보다 박스[j]의 값이 작거나 같으면 box 현재를 erase해준다 그리고 break;
7. 이중for문이 끝날 때 마다 ans를 ++ 해 준다.
8. box의 모든 값이 erase되어서 while문이 종료가 된다
9. ans 를 출력한다.
vector로 안하고 arr로 해결하려고 했다가 메모리초과와 out of bound가 떴던 문제
#include <bits/stdc++.h>
using namespace std;
vector<int>crain;
vector<int>box;
int N;
int M;
bool comp(int a,int b){
return a>b;
}
int main(){
cin >> N;
for (int i = 0; i <N ; ++i) {
int a;
cin >> a;
crain.push_back(a);
}
cin >> M;
for (int i = 0; i <M ; ++i) {
int a;
cin >> a;
box.push_back(a);
}
std::sort(crain.begin(), crain.end(),comp);
std::sort(box.begin(), box.end(),comp);
int ans =0;
if((crain[0]-box[0])<0){
cout << -1;
}else{
while(!box.empty()){
for (int i = 0; i <crain.size(); ++i) {
for (int j = 0; j <box.size(); ++j) {
if(crain[i]>=box[j]){
//cout << crain[i] << " " << box[j] <<"\n";
box.erase(box.begin()+j);
break;
}
}
}
ans++;
}
cout << ans;
}
}
'Algorythms' 카테고리의 다른 글
벡즌 19539 사과나무 c++ (0) | 2022.08.31 |
---|---|
백준 7983 내일할거야 c++ (0) | 2022.08.31 |
백준 1967 C++ 준코 (0) | 2022.08.08 |
백준 10757 자바 풀이 (0) | 2022.03.07 |
백준 2164번 자바 풀이 (0) | 2022.03.01 |