๋ฌธ์ ๋งํฌ
https://school.programmers.co.kr/learn/courses/30/lessons/86053
์๋ก์ด ๋์๋ฅผ ์ง๊ธฐ์ํด ์ฌ๋ฌ ๋๋ผ์์ ๊ธ๊ณผ ์์ ์ด์กํ๋ค. ์ด๋ ํ์ํ ๊ธ๊ณผ ์์ ๋ชจ๋ ์ด์กํ๊ธฐ์ํด ํ์ํ ์ต์ ์๊ฐ์ ๊ตฌํด๋ณด์.
ํ์ด
๊ฐ ๋์๋ง๋ค ์์์ ์์ด ํ์ ๋์ด์๊ณ , ํ ๋ฒ์ ์ด๋ฐํ ์ ์๋ ์๊ณผ, ํ ๋ฒ ์ด๋ฐ์ ํ์ํ ์๊ฐ์ด ๋ชจ๋ ๋ค๋ฅด๋ค.
์ต์ ์ ์๊ฐ์ ๊ตฌํ๊ธฐ ์ํด์ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๋ค ๋ฐ์ ธ๋ณด๊ธฐ์ ๋ง์ด ์๋๋ค.
๊ทธ๋์ ๋๋ ์ ํ์๊ฐ์ ๊ฑธ์ด๋๊ณ , ์ด ์๊ฐ์์ ์ ํด์ง ๊ธ๊ณผ ์์ ์ฎ๊ธธ ์ ์๋์ง ์ฌ๋ถ๋ฅผ ํ์ ํ๋ คํ๋ค.
์ด๋ ์ ํ์๊ฐ์ ์ด๋ถํ์์ ํตํด ์ค์ ํด์ค๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด๊ธฐ ๋ฒ์์ธ L๊ณผ R๊ฐ์ ์ ํด์ค์ผํ๋๋ฐ, L์ ์ต์์๊ฐ์ด๋ฏ๋ก ๊ฐํธํ๊ฒ 0์ผ๋ก ์ค์ ํ์.
R์ ์ต์ ์ ๊ฒฝ์ฐ์ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ผ๋ก ์ค์ ํด์ค์ผํ๋๋ฐ
์์์ ์ด๋ฐํ ๋์๊ฐ ํ๋๋ง ์๊ณ , ์ด๋ฐํ ์ ์๋ ์์ 1ํ์ 1๋ง ์ด๋๊ฐ๋ฅํ๊ณ , ํธ๋์ ํ์ํ ์๊ฐ์ 10^5 ๋ผ๊ณ ์ต์ ์ ์กฐ๊ฑด์ ๊ฑธ์ด๋ณด์.
๊ธ๊ณผ ์์ ๊ฐ๊ฐ 10^9๋งํผ ํ์ํ๋ค. ๋ฐ๋ผ์ ์ด ์ด๋ฐํด์ผํ ์์ 2 * 10^9.
๋ง์ง๋ง ์ด๋ฐ๋๋ ์๋ณต์ด ์๋ ํธ๋๋ก๋ง ์ด๋ํ๋ฉด ๋๋ฏ๋ก
๋ง์ง๋ง ์ด๋ฐ : 10^5์๊ฐ ์ฌ์ฉ, 1 ์ด๋ฐ
๋๋จธ์ง ์ด๋ฐ : 2 * 10^5์๊ฐ ์ฌ์ฉ, 1์ด๋ฐ
๋ฐ๋ผ์ ์ด ๊ฑธ๋ฆฌ๋ ์๊ฐ์ 10^5 + (2 * 10^9 - 1) * 2 * 10^5 ์ด๋ค.
์ด๋ 2 * 10^9 ์์ 1๋นผ๋๊ฑด ๊ฑฐ์ ์๋ฏธ๊ฐ ์๋ ๊ณ์ฐ์ด๋ฏ๋ก 2 * 10^9๋ก ์๊ฐํ๋ฉด
4 * 10^14 + 10^5๊ฐ ์ต์ ์ ๊ฒฝ์ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ด๋ค. ์ด ๊ฐ์ R๋ก ์ค์ ํด์ค๋ค.
์ด๋ถ ํ์์ ์ด์ฉํด์ mid์๊ฐ ์์ ์ ํด์ง ์์ ์ด๋ฐ์ด ๊ฐ๋ฅํ๋ฉด R = mid -1๋ก ์๊ฐ์ด ์์์ง ์ ์๋๋ก ์ ๋ํ๋ค.
๋ฐ๋๋ก mid์๊ฐ ์์ ์ ํด์ง ์์ ์ด๋ฐํ์ง ๋ชปํ๋ฉด L = mid + 1๋ก ์๊ฐ์ด ์ปค์ง ์ ์๋๋ก ์ ๋ํ๋ค.
1. ๋ชจ๋ ๋์์์ ์ด๋ฐ ๊ฐ๋ฅํ ์ด ๊ธ์ ์์ ๊ตฌํ๋ค. (์ดํ Gold)
2. ๋ชจ๋ ๋์์์ ์ด๋ฐ ๊ฐ๋ฅํ ์ด ์์ ์์ ๊ตฌํ๋ค. (์ดํ Silver)
Gold ๊ฐ์ด ์ด๋ฐํด์ผํ ๊ธ์ ์ a ๋ณด๋ค ํฌ๊ณ , Silver ๊ฐ์ด ์ด๋ฐํด์ผํ ์์ ์ b๋ณด๋ค ํฌ๋ฉด
์ฆ, (Gold >= a && Silver >= b)๋ฉด ์๊ฐ ๋ด์ ์ด๋ฐ์ด ๊ฐ๋ฅํ๋ค๊ณ ํ๋จํ๋ฉด ๋ ๊น??
๋ต์ ์๋๋ค.
๋ง์ฝ ๋ ๋์๊ฐ ์๊ณ , ๊ธ๊ณผ ์์ ๊ฐ๊ฐ 10๋งํผ ์ด๋ฐํด์ผํ๋ค๊ณ ๊ฐ์ ํ์.
1๋ฒ ๋์๋ ๊ธ๊ณผ ์์ 10์ฉ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ํธ๋ 5์๊ฐ, 1ํ ์ด๋ฐ์ 5๋งํผ ์ด๋ฐ ๊ฐ๋ฅ.
2๋ฒ ๋์๋ ๊ธ๊ณผ ์์ 10์ฉ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ํธ๋ 10์๊ฐ, 1ํ ์ด๋ฐ์ 1๋งํผ ์ด๋ฐ ๊ฐ๋ฅ.
๋ง์ฝ ์ฃผ์ด์ง ์๊ฐ mid๊ฐ 15์๊ฐ์ด๋ผ๊ณ ํ๋ค๋ฉด
1๋ฒ ๋์๋ 10 + 5 => 2ํ ์ด๋ฐ ๊ฐ๋ฅํ๋ฏ๋ก ์ด๋ฐ ๊ฐ๋ฅํ ๊ธ๊ณผ ์์ ๊ฐ๊ฐ 10
2๋ฒ ๋์๋ 10 + 0 => 1ํ ์ด๋ฐ ๊ฐ๋ฅํ๋ฏ๋ก ์ด๋ฐ ๊ฐ๋ฅํ ๊ธ๊ณผ ์์ ๊ฐ๊ฐ 1
Gold, Silver ๊ฐ์ 11์ด๊ณ ์ด๋ ๋ชจ๋ 10๋ณด๋ค ํฌ๋๊น
(Gold >= a && Silver >= b) ์กฐ๊ฑด์ ๋ง์กฑํ๋ค. ํ์ง๋ง 1๋ฒ ๋์๊ฐ ๊ธ์ 10์ฎ๊ธฐ๋ ๋์ 2๋ฒ ๋์๋ ์์ 1๋งํผ ๋ฐ์ ์ฎ๊ธฐ์ง ๋ชปํ๋ฏ๋ก a๋ง ์ถฉ์กฑ๋๊ณ b๋ ์ถฉ์กฑ๋์ง ์๋๋ค.
๋ฐ๋ผ์ ์กฐ๊ฑด์ด ํ๋ ์ถ๊ฐ๋์ด์ผํ๋ค.
๊ธ, ์ ์๊ด์์ด ๋ชจ๋ ๋์์ ์๊ฐ ๋ด์ ์ด๋ฐ ๊ฐ๋ฅํ ์์์ ์ด ํฉ์ Total ์ด๋ผ๊ณ ํ์.
Total >= a + b ๋ฅผ ๋ง์กฑํด์ผ ๊ธ๊ณผ ์์ ๋ชจ๋ ์ถฉ์กฑ์ํฌ ์ ์๋ค.
๋ฐ๋ผ์ (Total >= a + b && Gold >= a && Silver >= b) ์กฐ๊ฑด์ ๋ง์กฑํด์ผ ์ด๋ฐ ๊ฐ๋ฅํ ๊ฒ์ด๋ผ ํ๋จ์ ๋ด๋ฆฐ๋ค.
์ฝ๋ ์์ฑ
|
#include <bits/stdc++.h>
using namespace std;
long long solution(int a, int b, vector<int> g, vector<int> s, vector<int> w, vector<int> t) {
long long answer = -1;
long long L = 0; long long R = 4 * pow(10,14) + pow(10,5);// ์ต์
์ ๊ฒฝ์ฐ
if(a == 0 && b == 0)
return 0;
while(L <= R){
long long mid = (L + R) / 2; //mid์๊ฐ ์์ ๋ฌผ์ ์กฐ๋ฌ์ด ๊ฐ๋ฅํ๊ฐ?
long long Gold = 0;
long long Silver = 0;
long long Total = 0;
for(int i = 0; i<w.size(); i++){
long long move = (mid + t[i]) / (t[i] * 2); //์ด๋ฐ ํ์
Gold += min((long long)g[i], move * w[i]);
Silver += min((long long)s[i], move * w[i]);
Total += min((long long)g[i] + s[i], move * w[i]);
}
if(Total >= a + b && Gold >= a && Silver >= b){
R = mid - 1;
if(answer == -1)
answer = mid;
else answer = min(answer, mid);
continue;
}
else{
L = mid + 1;
}
}
return answer;
}
|
cs |
'ํ๋ก๊ทธ๋๋จธ์ค > 3๋จ๊ณ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค Lv3] : ๊ฒฝ์ฃผ๋ก ๊ฑด์ค (0) | 2022.07.14 |
---|---|
[ํ๋ก๊ทธ๋๋จธ์ค Lv3] : ํฉ์น ํ์ ์๊ธ (0) | 2022.07.13 |
[ํ๋ก๊ทธ๋๋จธ์ค Lv3] : GPS (0) | 2022.07.08 |
[ํ๋ก๊ทธ๋๋จธ์ค Lv3] : ๋ถ๋ ์ฌ์ฉ์ (0) | 2022.07.07 |
[ํ๋ก๊ทธ๋๋จธ์ค Lv3] : ํ ํธ์ง (0) | 2022.07.07 |