8개의 댓글이 있습니다.
-
-
Taeyoon_Lee -
medium은 우선순위 큐를 쓰면 시간복잡도를 더 줄일 수 있네요.
16년 전 link
-
-
-
Taeyoon_Lee -
음.. 처음 시작할 때 최소값을 구해놓고, 그 다음에 한번씩 자를 때마다 최소값을 갱신하면 돼요.
16년 전 link
-
-
-
Neon -
Hard는 풀어도 풀어도 잘 안되던데...어쨌든...
각 노드별로, 그 노드를 root로 잡은 형태의 tree를 구성한 다음에,
root 이하 각 node에 대해서
이 노드를 포함해서 0..n 명의 선수를 샀는데 loyal과 연결이 안된 경우
이 노드를 포함해서 0..n 명의 선수를 샀는데 loyal과 연결이 된 경우
이 노드를 포함하지 않고 0..n 명의, loyal과 연결된 선수를 사는 경우
에 대해서 계산합니다. 먼저 자식들을 계산한 다음에 그것들을 가지고 계산해낼 수 있겠죠?
결과값은 root 노드에 대해서
(포함 + m명 + loyal과 연결)/((포함 + m명 + loyal과 연결) + (불포함 + m명))
가 되겠지요.
16년 전 link
-
-
정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.
astein
두번 연속 쓰네요 굽신굽신 -.-
다른분들도 좀 써 주시죠 ㅠㅠ
문제설명
직선상에 N개의 행성들이 위치해 있다. i 번째 행성은 x[i] 좌표에 있고, m[i] 만큼의 질량을 가지고 있다. 각각의 행성들은 매우 강한 힘에 의하여 고정되어 있다. 어떤 두 행성도 같은 좌표에 있지 않다.
이 직선 상에 고정되지 않은 위성 P가 존재한다. 이 P는 왼족에 있는 행성들이 당기는 힘과 오른족에 있는 행성들이 당기는 힘이 같은 지점에서 멈춰있다. 질량이 m1, m2인 두 물체 사이의 거리가 d일 때, 두 물체는 서로 F = G * m1 * m2 / d^2 의 힘으로 서로 잡아당기는 만유인력이 있다. (G는 양의 상수이다.)
어떤점 P를 기준으로 만유인력의 벡터합이 0이 되는 P의 위치를 equilibrium Point라고 부른다. 달리 말하자면, P를 기준으로 왼쪽에 있는 행성들이 당기는 힘이 P를기준으로 오른쪽에 있는 행성들이 당기는 힘과 같은 점을 말한다
N개의 점이 있을 때, N-1개의 Equilibrium Point가 존재한다고 한다. 이러한 Equilibrium Point들을 오름차순으로 정렬하여 return하시오.
[spoiler="더 보기..."] - 문제풀이
어렵지 않은 문제 난이도임에도 불구하고 생각보다 많은 분들이 System Test를 통과하지 못했습니다. :(
어떤 두 점 사이의 Equilibrium Point를 찾는다고 가정하면, Binary Search를 이용하여 (항상 두 점 사이에 존재할테니까요) Eq.Point를 찾습니다. 이를 Eq.Point가 존재할 수 있는 N-1개의 구간에 대해서 찾습니다..
하지만 대부분의 Failed System Test인 코드를 보면 Binary Search의 "종료 조건"에 문제가 있었기 때문입니다. 두 범위의 차가 1e-10 미만이 되었을 때 루프를 종료한다고 지정하는 경우라도 문제가 발생할 수 있었지요.
예전에 한번 소개되었던 적이 있듯이, Binary Search의 경우에는 종료 조건을 구간으로 잡는것보다는, 일정 Loop만큼 수행하도록 작성하는게 효과적입니다. 100번만 루프를 돌아도, 오차는 초기값과 비교할 때, 2^-100 배가 되기 때문에 매우 작아지지요.[/spoiler]
Medium ( 500 pts )
struct cake weights, int maxCuts) { cakes;
{
int w, p;
cake(int _w, int _p) : w(_w), p(_p) {}
bool operator < (const cake &a) const
{
long long t1 = (long long)w * (long long)a.p;
long long t2 = (long long)p * (long long)a.w;
return t1 < t2;
}
};
struct CakesEqualization {
double fairDivision(vector
vector
sort(all(weights));
double ret = weights.back() - weights.front();
for (int i = 0; i < weights.size(); ++i)
cakes.pb(cake(weights[i], 1));
for (int i = 1; i <= maxCuts; ++i)
{
cakes.back().p++;
sort(all(cakes));
ret <?= (cakes.back().w * 1.0 / cakes.back().p) -
(cakes.front().w * 1.0 / cakes.front().p);
}
return ret;
}
};
16년 전