티스토리 뷰

PS

백준 1461. 도서관

tose33 2021. 8. 30. 20:07

https://www.acmicpc.net/problem/1461

 

1461번: 도서관

첫째 줄에 책의 개수 N과, 세준이가 한 번에 들 수 있는 책의 개수 M이 주어진다. 둘째 줄에는 책의 위치가 주어진다. N은 10,000보다 작거나 같은 자연수이고, M은 10,000보다 작거나 같다. 책의 위치

www.acmicpc.net

 

처음에 예제의 답이 어떻게 나오는지도 꽤 해맸다.

마지막에 책을 모두 제자리에 놓은 후에는 0으로 돌아오지 않아도 되므로 왕복하지 않아도 된다는 뜻이고,

왕복할때 좌표의 절댓값 * 2가 더해지므로 마지막에 가장 멀리있는 책을 놓으면 된다.

 

또한 음의좌표와 양의좌표를 한번에 가게되면 중간에 0을 들리게 되므로 비효율적이라 따로 생각해야한다.

따라서 음의좌표, 양의좌표를 따로 저장하고 정렬했다.

그후 먼곳부터 모두 m개의 책을 한번에 되돌려놓고, 

마지막에 음의좌표 최댓값, 양의좌표 최댓값중 더 큰값을 빼주면 왕복하지 않게 처리된다.

 

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int n,m;
vector<int> neg, pos;

int main()
{
    cin >> n >> m;
    for(int i = 0; i < n; i++)
    {
        int num;
        cin >> num;
        if(num < 0) // 절댓값
            neg.push_back(num * -1);
        else
            pos.push_back(num);
    }

    sort(neg.begin(), neg.end(), greater<>());
    sort(pos.begin(), pos.end(), greater<>());

    // out of bound 방지
    for(int i = 0; i < m; i++)
    {
        neg.push_back(0);
        pos.push_back(0);
    }

    int ans = 0;
    for(int i = 0; i < neg.size(); i+=m)
    {
        ans += neg[i] * 2;
    }
    for(int i = 0; i < pos.size(); i+=m)
    {
        ans += pos[i] * 2;
    }

    // 음수좌표, 양수좌표 최댓값중 가장 큰 값은 마지막에 자리에 놓음으로서 왕복하지 않음
    int bigger = max(neg[0], pos[0]);
    ans -= bigger;
    cout << ans;

}

 

 

'PS' 카테고리의 다른 글

백준 2212. 센서  (0) 2021.08.31
백준 17521. Byte Coin  (0) 2021.08.31
백준 20044. Project Teams  (0) 2021.08.30
백준 1417. 국회의원 선거  (0) 2021.08.30
백준 13164. 행복 유치원  (0) 2021.08.28
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함