๋ฌธ์
๊ณ ์ธต ๊ฑด๋ฌผ ๋ฌธ์ ๋ฐ๋ก๊ฐ๊ธฐ
์ธ์ค์์๋ ๊ณ ์ธต ๋น๋ฉ์ด ๋ง๋ค. ์ธ์ค์์ ์๋ฏผ ๊น์ง๋ฏผ์ ๊ฐ์ฅ ๋ง์ ๊ณ ์ธต ๋น๋ฉ์ด ๋ณด์ด๋ ๊ณ ์ธต ๋น๋ฉ์ ์ฐพ์ผ๋ ค๊ณ ํ๋ค. ๋น๋ฉ์ ์ด N๊ฐ๊ฐ ์๋๋ฐ, ๋น๋ฉ์ ์ ๋ถ์ผ๋ก ๋ํ๋ธ๋ค. i๋ฒ์งธ ๋น๋ฉ (1๋ถํฐ ์์)์ (i,0)๋ถํฐ (i,๋์ด)์ ์ ๋ถ์ผ๋ก ๋ํ๋ผ ์ ์๋ค. ๊ณ ์ธต ๋น๋ฉ A์์ ๋ค๋ฅธ ๊ณ ์ธต ๋น๋ฉ B๊ฐ ๋ณผ ์ ์๋ ๋น๋ฉ์ด ๋๋ ค๋ฉด, ๋ ์ง๋ถ์ ์๋ ์ ๋ถ์ด A์ B๋ฅผ ์ ์ธํ ๋ค๋ฅธ ๊ณ ์ธต ๋น๋ฉ์ ์ง๋๊ฑฐ๋ ์ ํ์ง ์์์ผ ํ๋ค. ๊ฐ์ฅ ๋ง์ ๊ณ ์ธต ๋น๋ฉ์ด ๋ณด์ด๋ ๋น๋ฉ์ ๊ตฌํ๊ณ , ๊ฑฐ๊ธฐ์ ๋ณด์ด๋ ๋น๋ฉ์ ์๋ฅผ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
ํ์ด
- ๊ธฐ์ธ๊ธฐ๋ฅผ ๋น๊ตํ์ฌ, ๋ ๊ธ๊ฒฉํ ๊ธฐ์ธ๊ธฐ๊ฐ ๋์ค๋ฉด ๋ณด์ด์ง ์๋ ๊ฒ์ผ๋ก ํ๋จ
- ๊ฐ์ฅ ๊ธ๊ฒฉํ ๊ธฐ์ธ๊ธฐ๋ฅผ ๊ณ์ ๊ฐฑ์
- ์ผ์ชฝ, ์ค๋ฅธ์ชฝ์ ๋ํด์ ๊ฐ๊ฐ ๋ณด์ด๋ ๊ฑด๋ฌผ ๊ฐ์ ๊ณ์ฐ
- ์ฌ๋ ค๋ค๋ณผ ์๋ ๋ด๋ ค๋ค๋ณผ ์๋ ์์
์ฝ๋
#include <iostream>
#include <math.h>
using namespace std;
int N;
long long height[50];
struct multiType {
long long common;
long long aMulti;
long long bMulti;
multiType(int c, int a, int b) {
common = c;
aMulti = a;
bMulti = b;
}
};
multiType* getCommonMulti(long long a, long long b) {
long long aMulti = 2; long long bMulti = 2;
long long newA = a; long long newB = b;
while (newA != newB) {
if (newA < newB) newA = a*aMulti++;
else newB = b*bMulti++;
}
return new multiType(newA, aMulti-1, bMulti-1);
}
bool isUpSlope(pair<long long, long long> newIncline, pair<long long, long long> oldIncline) {
auto multi = getCommonMulti(newIncline.second, oldIncline.second);
newIncline.first *= multi->aMulti;
newIncline.second *= multi->aMulti;
oldIncline.first *= multi->bMulti;
oldIncline.second *= multi->bMulti;
if (newIncline.first > oldIncline.first) return true;
else return false;
}
int getShownBuilding(int idx) {
// ๋ด๋ ค๋ค๋ณผ ์๋ ์๊ตฌ๋!
int num = 0;
pair<long long, long long> leftIncline = make_pair(-1e9, 1); // ๋ถ์ / ๋ถ๋ชจ
for (int i = idx-1; i >= 0; i--) {
// ์ผ์ชฝ
pair<long long, long long> newIncline = make_pair(height[i] - height[idx], idx - i);
if (!isUpSlope(newIncline, leftIncline)) continue;
num++;
leftIncline = newIncline;
}
pair<long long, long long> rightIncline = make_pair(-1e9, 1); // ๋ถ์ / ๋ถ๋ชจ
for (int i = idx + 1; i < N; i++) {
// ์ค๋ฅธ์ชฝ
pair<long long, long long> newIncline = make_pair(height[i] - height[idx], i - idx);
if (!isUpSlope(newIncline, rightIncline)) continue;
num++;
rightIncline = newIncline;
}
return num;
}
int main() {
// N์ 50๋ณด๋ค ์์
// ํ๋์ฉ ์กฐํํ๋ฉด์ ์ข์ฐ๋ก ๊ธฐ์ธ๊ธฐ ์ ์งํ๋ฉด์ ๋ช ๊ฐ์ธ์ง ์ธ๊ธฐ (๊ธฐ์ธ๊ธฐ๊ฐ ๋ ๊ธ๊ฒฉํด์ง๋ฉด ํด๋น ๊ธฐ์ธ๊ธฐ๋ก ๊ฐฑ์
cin >> N;
for (int i = 0; i < N; i++) {
cin >> height[i];
}
int result = 0;
for (int i = 0; i < N; i++) {
int num = getShownBuilding(i);
if (result < num) result = num;
}
cout << result;
}
๊ฐ์
- isUpSlope๋ฅผ doudle์ ๋๋์ ๊ณ์ฐ์ผ๋ก ๋ฐ๊พธ๋ฉด ํธํ๊ฒ ๋ฐ.
๊ฒฐ๊ณผ
์์ด๋ | ๋ฉ๋ชจ๋ฆฌ | ์๊ฐ | ์ฝ๋ ๊ธธ์ด |
---|---|---|---|
gmldms784 | 2020 | 0 | 2037 |
'Algorithm ๋ฌธ์ > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[c++] BOJ 14725 :: ๊ฐ๋ฏธ๊ตด (0) | 2021.09.07 |
---|---|
[c++] BOJ 3108 :: ๋ก๊ณ (0) | 2021.08.31 |
[c++] BOJ 17370 :: ์ก๊ฐํ ์ฐ๋ฆฌ ์์ ๊ฐ๋ฏธ (0) | 2021.08.24 |
[c++] BOJ 1941 :: ์๋ฌธ๋ ์น ๊ณต์ฃผ (0) | 2021.08.24 |
[c++] BOJ 18119 :: ๋จ์ด ์๊ธฐ (0) | 2021.08.10 |
Comment