블로그 언저리인 무언가
[백준/BOJ] 8980 택배 본문
728x90
문제 : 8980번: 택배
그리디하게 접근하여
트럭이 가장 가까운곳에 배달할 수 있는
최대한의 택배를 실고 있다고 가정하고 풀면 된다.
문제의 조건에서는 박스를 받는 마을에서만 내릴 수 있지만,
그 마을에서 안실었다고 가정하여 배송한 택배수에서만 빼버리는 식으로
바꾸어 생각하면 쉽게 코드를 작성할 수 있다.
Code
#include <bits/stdc++.h>
#define ll long long
using namespace std;
struct box{
ll idx, val; //배송위치, 개수
bool operator<(box& tmp){
return idx<tmp.idx;
}
};
ll N, C, M, ans, now;
vector<box> v[2005];
deque<box> dq;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N >> C >> M;
while (M--){
ll a, b, c;
cin >> a >> b >> c;
v[a].push_back({b,c});
}
for (int i=1;i<=N;i++){
while (!dq.empty() && dq.front().idx==i){ //현재위치에서 배송할것이 있다면 배송
now-=dq.front().val;
ans+=dq.front().val;
dq.pop_front();
}
sort(v[i].begin(),v[i].end()); //받는 위치가 가까운 순으로 정렬
for (int j=0;j<v[i].size();j++){ //일단 모든 택배를 다실음
dq.push_back(v[i][j]);
now+=v[i][j].val;
}
sort(dq.begin(),dq.end()); //받는 위치가 가까운 순으로 정렬
while (now>C){ //트럭 크기에서 넘치는 박스들을 버림
ll x=dq.back().val;
if (now-x>=C){
dq.pop_back();
now-=x;
}
else{
dq.back().val-=now-C;
now=C;
}
}
}
cout << ans;
return 0;
}
728x90
'Programming > BOJ' 카테고리의 다른 글
[백준/BOJ] 1081 합 (3) | 2025.08.14 |
---|---|
[백준/BOJ] 32990 시설물 사용 신청 (0) | 2025.08.13 |
[백준/BOJ] 16236 아기 상어 (1) | 2022.09.20 |
[백준/BOJ] 20301 반전 요세푸스 (0) | 2022.09.20 |
[백준/BOJ] 20365 블로그2 (0) | 2022.09.20 |
Comments