https://www.acmicpc.net/problem/8980
8980번: 택배
입력의 첫 줄은 마을 수 N과 트럭의 용량 C가 빈칸을 사이에 두고 주어진다. N은 2이상 2,000이하 정수이고, C는 1이상 10,000이하 정수이다. 다음 줄에, 보내는 박스 정보의 개수 M이 주어진다. M은 1이
www.acmicpc.net
생각해보기
- 시작은 무조건 1번이므로 최대한 빨리 내리는 것들을 위주로 동작을 하는 것이 이득이다.
- 정렬을 도착점을 기준으로 진행 해주자.
- 시작점과 도착점 사이에서 트럭의 용량인 C를 넘는지 확인해주고, 넘지 않는 정도만 담도록 진행한다.
- 시작점과 도착점 중간에서 대량의 상자를 옮겼을 가능성이 있으므로 중간 과정에서 트럭의 최대 용량을 구한 뒤, 나머지 양을 싣고 출발하자.
- 사이에서는 그 양만큼 트럭 용량이 증가한 것이므로 전부 증가시켜준다.
코드
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
typedef struct data{
int start, end, cost;
}d;
int N,C;
int M;
vector<d> boxes;
int chk[2001];
bool op(d &a, d &b){
if(a.end == b.end){
return a.start < b.start;
}
return a.end < b.end;
}
void input(){
int a,b,c;
cin>>N>>C>>M;
for(int i=0;i<M;++i){
cin>>a>>b>>c;
boxes.push_back({a,b,c});
}
}
void solution(){
int answer = 0;
sort(boxes.begin(), boxes.end(), op);
for(int i=0;i<M;++i){
int start = boxes[i].start;
int end = boxes[i].end;
int cost = boxes[i].cost;
int maxnum = *max_element(&chk[start], &chk[end]);
int num = min(cost, C-maxnum);
for(int j=start;j<end;++j){
chk[j] += num;
}
answer += num;
}
cout << answer;
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
input();
solution();
return 0;
}

728x90
'알고리즘 > 백준 문제' 카테고리의 다른 글
| 19591 - 독특한 계산기 (0) | 2023.07.13 |
|---|---|
| 20057 - 마법사 상어와 토네이도 (0) | 2023.07.12 |
| 9527 - 1의 개수 세기 (0) | 2023.07.07 |
| 1781 - 컵라면 (0) | 2023.07.03 |
| 13144 - List of Unique Number (0) | 2023.06.30 |
댓글