algorithm

BOJ 1826

rkawk 2022. 10. 7. 23:41
더보기

μ—°λ£Œ μ±„μš°κΈ° μ„±κ³΅

 
2 초 128 MB 5856 1716 1320 28.897%

문제

μ„±κ²½μ΄λŠ” νŠΈλŸ­μ„ μ •κΈ€ μ†μ—μ„œ μš΄μ „ν•˜λ‹€κ°€ 트럭의 μ—°λ£Œνƒ±ν¬μ— κ°‘μžκΈ° ꡬ멍이 λ‚˜μ„œ 1kmλ₯Ό κ°€λŠ”λ° 1L의 μ—°λ£Œκ°€ μƒˆ λ‚˜κ°€κ²Œ λ˜μ—ˆλ‹€. 이것을 고치기 μœ„ν•΄μ„œλŠ” κ°€μž₯ κ°€κΉŒμš΄ λ§ˆμ„μ— κ°€μ•Ό ν•œλ‹€. 그런데 κ·Έλƒ₯ κ°€λ‹€κ°€λŠ” 쀑간에 μ—°λ£Œκ°€ λ‹€ 빠질 μˆ˜κ°€ μžˆλ‹€. λ‹€ν–‰μŠ€λŸ½κ²Œλ„ μ •κΈ€ 곳곳에 μ—°λ£Œλ₯Ό μ±„μšΈ 수 μžˆλŠ” μ£Όμœ μ†Œκ°€ N개 μžˆλ‹€. 그런데 μ •κΈ€ μ†μ—μ„œ 쀑간에 μ°¨λ₯Ό λ©ˆμΆ”λŠ” ν–‰μœ„λŠ” 맀우 μœ„ν—˜ν•œ ν–‰μœ„μ΄λ―€λ‘œ μ£Όμœ μ†Œμ—μ„œ λ©ˆμΆ”λŠ” 횟수λ₯Ό μ΅œμ†Œν™” ν•˜λ € ν•œλ‹€.

그리고 닀행이도 μ„±κ²½μ΄μ˜ νŠΈλŸ­μ€ 맀우 μ’‹μ•„μ„œ μ—°λ£Œ νƒ±ν¬μ—λŠ” μ—°λ£Œμ˜ μ œν•œμ΄ 없이 많이 μΆ©λΆ„νžˆ 많이 넣을 수 μžˆλ‹€κ³  ν•œλ‹€. 각각의 μ£Όμœ μ†Œμ˜ μœ„μΉ˜μ™€, 각 μ£Όμœ μ†Œμ—μ„œ 얻을 수 μžˆλŠ” μ—°λ£Œμ˜ 양이 μ£Όμ–΄μ Έ μžˆμ„ λ•Œ, μ£Όμœ μ†Œμ—μ„œ λ©ˆμΆ”λŠ” 횟수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

정글은 일직선이고, μ„±κ²½μ΄μ˜ 트럭과 μ£Όμœ μ†Œλ„ λͺ¨λ‘ 일직선 μœ„μ— μžˆλ‹€. μ£Όμœ μ†ŒλŠ” λͺ¨λ‘ μ„±κ²½μ΄μ˜ νŠΈλŸ­μ„ κΈ°μ€€μœΌλ‘œ 였λ₯Έμͺ½μ— μžˆλ‹€.

μž…λ ₯

첫째 쀄에 μ£Όμœ μ†Œμ˜ 개수 N(1 ≤ N ≤ 10,000)κ°€ μ£Όμ–΄μ§€κ³  두 번째 쀄뢀터 N+1번째 쀄 κΉŒμ§€ μ£Όμœ μ†Œμ˜ 정보가 μ£Όμ–΄μ§„λ‹€. μ£Όμœ μ†Œμ˜ μ •λ³΄λŠ” λ‘κ°œμ˜ μ •μˆ˜ a,b둜 이루어 μ Έ μžˆλŠ”λ° a(1 ≤ a ≤ 1,000,000)λŠ” μ„±κ²½μ΄μ˜ μ‹œμž‘ μœ„μΉ˜μ—μ„œ μ£Όμœ μ†Œ κΉŒμ§€μ˜ 거리, 그리고 b(1 ≤ b ≤ 100)λŠ” κ·Έ μ£Όμœ μ†Œμ—μ„œ μ±„μšΈ 수 μžˆλŠ” μ—°λ£Œμ˜ 양을 μ˜λ―Έν•œλ‹€. 그리고 N+2번째 μ€„μ—λŠ” 두 μ •μˆ˜ Lκ³Ό Pκ°€ μ£Όμ–΄μ§€λŠ”λ° L(1 ≤ L ≤ 1,000,000)은 μ„±κ²½μ΄μ˜ μœ„μΉ˜μ—μ„œ λ§ˆμ„κΉŒμ§€μ˜ 거리, P(1 ≤ P ≤ 1,000,000)λŠ” νŠΈλŸ­μ— μ›λž˜ 있던 μ—°λ£Œμ˜ 양을 μ˜λ―Έν•œλ‹€.

좜λ ₯

첫째 쀄에 μ£Όμœ μ†Œμ—μ„œ λ©ˆμΆ”λŠ” 횟수λ₯Ό 좜λ ₯ν•œλ‹€. λ§Œμ•½ λ§ˆμ„μ— λ„μ°©ν•˜μ§€ λͺ»ν• κ²½μš° -1을 좜λ ₯ν•œλ‹€.

예제 μž…λ ₯ 1 λ³΅μ‚¬

4
4 4
5 2
11 5
15 10
25 10

예제 좜λ ₯ 1 λ³΅μ‚¬

3​

17λ²ˆλ§Œμ— 맞좘 λ¬Έμ œμ΄λ‹€.

 

μ—°λ£Œν•˜λ‚˜, κ±°λ¦¬ν•˜λ‚˜λ₯Ό κΈ°μ€€μœΌλ‘œ ν•΄μ•Όλœλ‹€λŠ” 것은 3λΆ„λ§Œμ— μ•Œμ•„λƒˆλŠ”λ° κ²°κ΅­ μ΄ν‹€λ™μ•ˆ ν’€μ—ˆλ‹€.

 

κ²°κ΅­ 계속 이 문제λ₯Ό ν‹€λ¦° μ΄μœ λŠ” 

λΆ„λͺ… μ—°λ£Œλ₯Ό κΈ°μ€€μœΌλ‘œ ν–ˆμ„λ•Œ, κ°ˆμˆ˜μžˆλŠ” μ£Όμœ μ†Œ(μ£Όμœ μ†Œμ˜ 거리가 μ—°λ£Œλ³΄λ‹€ μž‘μ€ 경우)의 μ—°λ£Œμ˜ 양은 κ·Έλƒ₯ 더해주면 λœλ‹€.

μ™œ 이걸 ν—·κ°ˆλ ΈλŠ”μ§€λŠ” λͺ¨λ₯΄κ² μ§€λ§Œ, μ—°λ£Œμ˜ μ–‘ 을 μ΅œλŒ€κ±°λ¦¬λ‘œ 작고 λŠ˜λ €λ‚˜κ°€λ©΄ λ˜λŠ”λ° μ •λ₯˜μ†Œμ˜ μœ„μΉ˜λ₯Ό μž‘μ•„μ€¬λ‹€.

그리고 거기에 κ°„ 거리만큼 λΉΌμ£Όκ³ , μ—°λ£Œλ§ŒνΌ 더해주고. 이런 κ³Όμ •μ—μ„œ λ°˜λ‘€κ°€ 생긴 것 κ°™λ‹€.

 

 

#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
priority_queue<pair<int,int>, vector<pair<int,int>>, less<>>pq_fuel;
vector<pair<int,int>>v;
int N,L,P,ans, st,arr[10000];
int main(){
    cin>>N;
    for(int i=0; i<N; i++){
        int a, b;
        cin>>a>>b;
        v.push_back({a,b});
    }
    sort(v.begin(), v.end());
    cin>>L>>P;
    while(P+st < L){
        for(int i=0; i<v.size(); i++){
            if(arr[i]) continue;
            if(P >= v[i].first) {
                arr[i] = 1;
                pq_fuel.push({v[i].second, v[i].first});
            }
        }
        if(pq_fuel.empty()){
            cout<<-1;
            return 0;
        }
        P += pq_fuel.top().first;
        pq_fuel.pop();
        ans += 1;
    }
    cout<<ans;


}