4개의 댓글이 있습니다.
-
-
nocut98 -
알고리즘은 레드 5분만 올라가셨다는...
저랑 별로 차이는 없는데, 왜 저는 안드로메다로 갔을 까요? (아마 중간에 계산식이 틀린 듯 ㅡ.ㅜ)
이번엔 맘먹고 상위랭커 좀 되보겠다고 너무 계산식이 복잡해져서 나중엔 버그가 있는 줄 알면서도 그냥 건드릴 수 없게 되버린 거 같습니다. ㅡ.ㅜ 보정치들이 너무 많아져서 나중엔 뭘 계산해야 할지;;; 순간순간 최적화의 기쁨을 맛보기도 했는데, 처음에 한 200초가 걸리던 것들을 자료구조를 수정해주니 1초 미만이 되기도 하더군요. 역시 단순하게 배열쓰는게 짱이다...라는 것도 배웠구요.
항상 그렇지만, 끝나고 나니 아쉬움이 마구 밀려오네요.
라운드3의 MM에는 참가 예정입니다. 어짜피 나중에 절대 점수로 반영되니 거기서 12등안에 드는 것을 목표로 달려볼까 합니다
ㅡ.ㅡ;;
16년 전 link
-
-
정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.
하나반
TCO 08 티셔츠가 걸린 대회였습니다.
문제는 Epidemic
바이러스가 퍼져나가는데.. 예방접종과 주위 사람들을 못만나게 하는(edge Reduce를 해석하면 뭐가 되는지?) 2가지 방법을 적절히 사용해서 제일 돈이 적게 드는 방법을 찾아라... 는 문제였습니다.
일요일에.. 64점 정도로 submit을 했었는데.. 이때 등수가 30등 정도 였었던것 같습니다.
100등까지 진출이니까 안전하겠지 하고 안심하고 있었는데.. 하루하루 등수 떨어지는게 장난이 아닙니다. -_-;
부랴부랴 소스 수정한다고 회사에서 눈치 봐가면서 30분마다 example 돌렸습니다.
visualizer가 제공이 되지 않아서 시뮬레이터를 만들까 하다가 귀찮기도 하고 37번이나 example test를 하게 되었습니다.
역시 시뮬레이터는 필수..
결국.. provisional score로 100등이 64.04점이었습니다.
먼저 init().
1) 각각의 노드마다 edge list를 만듭니다. 이 때 반대쪽도 만듭니다.
2) 감염확률은 risk로 1,2,3의 값이 주어지는데.. 평균적으로 테스트해보니까 phigh, plow 사이에서 .1633, .5, .8367 정도의 값을 가지게 되어서 각각 그 값으로 확률값을 넣어줍니다.
3) 각 노드별로 연결되어 있는 사람들의 감염확률의 합을 계산합니다. 이 값은 이사람이 감염될 경우 주위에 감염시킬 확률을 계산하는데 쓰입니다.
4) K==2인 경우에 초기에 감염될 확률이 많은 사람들은 미리 예방접종을 합니다. 계산식은 확률을 이용하였습니다. K==0일 때는 할 필요가 전혀 없고, K==1일때는 예방접종을 시켜보니 결과가 썩 좋지 않게 나와서 적용하지 않기로 했습니다.
[spoiler="더 보기..."] ~~~ c
int i, j; ans(0);
// 1) 부분..
for (i = 0; i < g.size(); i += 2) {
node[g[i]].fr.push_back(g[i+1]);
node[g[i]].edg.push_back(false);
node[g[i]].cnt_fr++;
node[g[i+1]].fr.push_back(g[i]);
node[g[i+1]].edg.push_back(false);
node[g[i+1]].cnt_fr++;
}
// 2) 부분
float pp[4];
pp[1] = plow + (phigh - plow) * .1633;
pp[2] = (plow + phigh) / 2;
pp[3] = phigh - (phigh - plow) * .1633;
for (i = 0; i < n; i++) {
node[i].p = pp[risk[i]];
}
// 3) 부분
for (i = 0; i < n; i++) {
for (j = 0; j < node[i].fr.size(); j++) {
node[i].p_fr += node[node[i].fr[j]].p;
}
}
vector
float ratio;
// 4) 부분
if (k == 2) {
for (i = 0; i < n; i++) {
ratio = powf(pp[2] * (g.size() / n), k) * node[i].p * node[i].p_fr / n;
if (ratio * cost_inf * (1 - x) > cost_ino) {
ans.push_back(i);
for (j = 0; j < node[i].fr.size(); j++) {
node[node[i].fr[j]].p_fr -= node[i].p * (1 - x);
}
node[i].p *= x;
node[i].ino = true;
}
}
}
16년 전