fragment-header
fragment-markdown
홈
로그인
로그아웃
내 블로그
설정
로그인
백준 21778 (C++) 가희와 프로세스 2
최초 업로드: 2025-07-23 13:16:09
최근 수정 시간: 2025-07-23 13:16:50
게시자: rlatjwls3333
카테고리: 백준
조회수: 4
# [Platinum V] 가희와 프로세스 2 [문제 링크](https://www.acmicpc.net/problem/21778) ## 문제 설명 <p>가희는 스케쥴러를 구현하라는 과제를 받았습니다. 스케쥴러가 <strong>실행시킬 프로세스를 선택하는 기준</strong>은 아래와 같습니다.</p> <ul> <li>우선 순위 값이 제일 큰 프로세스</li> <li>우선 순위 값이 제일 큰 프로세스가 여러 개라면, <em>id</em>가 가장 작은 프로세스</li> </ul> <p>가희가 만든 스케쥴러는 다음 알고리즘으로 실행됩니다.</p> <ol> <li>실행시킬 프로세스를 기준에 따라 선택합니다. 선택된 프로세스의 <em>id</em>를 <em>id<sub>s</sub></em>라 합니다. <em>id</em><sub><em>s</em></sub>를 실행시킵니다.</li> <li>1초가 지난 후, 프로세스 <em>id</em>가 <em>id<sub>s</sub></em>인 프로세스를 제외한 <strong>나머지 프로세스들의 우선 순위가 1 상승합니다.</strong> 프로세스 <em>id</em>가 <em>id<sub>s </sub></em>인 프로세스의 실행을 마치는 데 필요한 시간은 1 감소합니다.</li> <li>실행 시간이 남은 프로세스가 있다면 1로 돌아가고, 그렇지 않으면 종료합니다.</li> </ol> <p>동시에 실행되는 프로세스는 1개이고, 1초일 때 가희가 만든 스케쥴러는 최초로 선택한 프로세스를 실행시키는 작업을 합니다.</p> <p>가희는 <em>t</em>초일 때, 스케쥴러가 어떤 프로세스를 선택하는지 알고 싶습니다. 가희를 도와주세요. </p> ## 입력 <p>첫 번째 줄에 <i>Q</i>, <em>n</em>이 주어집니다.</p> <p>두 번째 줄 부터 n+1번째 줄까지 프로세스에 대한 정보 <em>A<sub>i</sub></em>, <em>B<sub>i</sub></em>, <em>C<sub>i</sub></em>가 공백으로 구분되어 주어집니다.</p> <p>이것은 i번째 process의 <em>id</em>가 <em>A<sub>i</sub></em>이고, 프로세스 <em>id</em>가 실행을 마치는 데 필요한 시간이 <em>B<sub>i</sub></em>초이고, 초기 우선 순위가 <em>C<sub>i</sub></em>임을 의미합니다.</p> <p><em>n+2</em>번째 줄부터 <em>n+1+Q</em>번째 줄까지 문제 <em>Q</em>개에 대한 정보가 아래와 같이 주어집니다.</p> <p><em>T<sub>c</sub></em></p> <p><em>T<sub>c</sub></em>는 <em>T<sub>c</sub> </em>초일 때, 가희가 만든 스케쥴러가 선택한 프로세스 <em>id</em> 값이 어떤 것인지 묻는 문제를 의미합니다.</p> ## 출력 <p>문제에 대한 답을 <em>Q</em>개의 줄에 출력합니다.</p> ## 풀이 #### 우선순위($C_i$)를 어디까지 공통으로 감소시킬 지를 이분탐색으로 찾았다. 이것만 찾고나면 나머지 연산은 최대 N번이기에 시간 안에 통과한다. ``` c++ #include<bits/stdc++.h> using namespace std; const long long extra = 1e15; // 우선순위에 공통으로 더해줄 적당히 큰 수 struct element { long long a, b, c; bool operator<(const element e) const { if(c==e.c) return a < e.a; return c > e.c; } }; int main() { ios::sync_with_stdio(0); cin.tie(0); int q, n; cin >> q >> n; vector<element> v(n); for(int i=0;i<n;i++) { cin >> v[i].a >> v[i].b >> v[i].c; v[i].c += extra; } while(q--) { long long t; cin >> t; // 우선순위를 어디까지 공통으로 감소시킬지 이분탐색 long long left=1, right=1e17; while(left<right) { long long mid = (left+right)/2; long long sum=0; for(int i=0;i<n;i++) sum += min(max(v[i].c-mid, 0LL), v[i].b); if(sum>=t) left=mid+1; else right=mid; } // 나머지 연산은 최대 n번 vector<element> cur; for(int i=0;i<n;i++) { long long cnt = max(v[i].c-left, 0LL); if(v[i].b>cnt) cur.push_back({v[i].a, v[i].b-cnt, v[i].c-cnt}); t -= min(cnt, v[i].b); } sort(cur.begin(), cur.end()); cout << cur[t-1].a << '\n'; } } ```