상세 컨텐츠

본문 제목

구두 수선공 (JUNGOL 6271)

PS,CP

by 코딩생활 2026. 4. 20. 09:00

본문

 

https://jungol.co.kr/problem/6271


아이디어

Exchange Argument를 이용해봅시다.

어떠한 순서에서 i번째 작업과 i+1번째 작업을 비교해봅시다.

현재 i번째 작업이 끝나는 시점이 t라고 하면, i+1번째 작업이 끝나는 시점은 t+Ti+1이며, 보상금은 V1=t*Si+(t+Ti+1)*Si+1입니다. 만약 두 작업의 순서를 바꾼다면 보상금은 V2=(t+Ti+1-Ti)*Si+1+(t+Ti+1)*Si입니다. V1-V2를 해주면 Ti*Si+1-Ti+1*Si가 됩니다. 이 값이 음수가 되도록 순서를 유지시켜주어야하므로 Si/Ti가 증가하는 순서대로 작업을 배치해주면 됩니다.


소스코드

#include <iostream>
#include <algorithm>
#include <vector>
#include <array>
#define ll long long
using namespace std;

bool cmp(array <ll,3> A,array <ll,3> B)
{
    if (A[2]*B[1]!=A[1]*B[2]) return A[2]*B[1]>A[1]*B[2];
    return A[0]<B[0];
}

int main()
{
	ios_base::sync_with_stdio(false); cin.tie(NULL);
    ll N,i,a,b;
    vector <array <ll,3> > v;

    cin>>N;
    for (i=1;i<=N;i++)
    {
        cin>>a>>b;
        v.push_back({i,a,b});
    }

    sort (v.begin(),v.end(),cmp);

    for (i=0;i<N;i++)
        cout<<v[i][0]<<' ';
}

'PS,CP' 카테고리의 다른 글

정올이의 모의고사 (JUNGOL 5092)  (0) 2026.04.21
쿠폰 (JUNGOL 3762)  (0) 2026.04.20
Simply Sitting on Chairs (CF R 1089 Div.2 - B)  (0) 2026.04.19
A Simple Sequence (CF R 1089 Div.2 - A)  (0) 2026.04.19
Grid Covering (CF R 1091 Div.2 - C)  (0) 2026.04.18

관련글 더보기