2010-02-18
SRM462
wataさんと同じ部屋
| DIV | level | 問題名 | 競技中 | 後で | System Test | 通過率 | 備考 |
|---|---|---|---|---|---|---|---|
| 1 | 250 | AgeEncoding | o(再提出) | - | passed | - | 85.34 |
| 1 | 450 | CandyBox | o | - | passed | - | 235.35 |
| 1 | 1000 | WarTransportation | 未提出 | - |
Easy(250): AgeEncoding
- ばいなりさーち
- 上限下限の算定が間違ってて範囲内に見つからないぞ
- 直す
- n進法で再計算するところも間違ってて計算ずれてる
- 直す
- submitted(33'20'')
- Mediumの問題を開く
- が、戻ってきて適当なテストケースを2,3追加
- "111"では1歳は表現できんだろ
- でも"110"で1歳は行けるんだよな
- 仕方ない。再提出するか
- 85.34pts (penalty 10% included)
#define sz(a) int((a).size())
#define pb push_back
#define all(c) (c).begin(),(c).end()
#define tr(c,i) for(typeof((c).begin()) i=(c).begin(); i!=(c).end(); i++)
#define rep(var,n) for(int var=0;var<(n);var++)
class AgeEncoding {
vector<int> v; int k; double g;
double rt(int a,int n){
return pow((double)a, 1.0/n); }
double q(double z){
double x=1.0, a=0;
rep(i,k){
a += x * v[i];
x *= z;
}
return a;
}
double md(double lo,double hi) {
double m=(lo+hi)/2;
if(hi-lo < 1e-9) return m;
return q(m)>g ? md(lo,m) : md(m,hi);
}
public:
double getRadix(int age, string candlesLine) {
int l=sz(candlesLine), t=1,b=0; g=(double)age;
v.clear();
rep(i,l){
int n=candlesLine[i]-48;
if (t&&n==0)continue;
t=0;
v.pb(n); if (n) b++;
}
k=sz(v); reverse(all(v));
if(k==1) return age==1? -2 : -1;
if(k==0 || b==0) return -1;
if(k==0) return -1;
if(b==1) return rt(age,k-1);
if(age==1 && v[0]==1) return -1; /// ←ここ追加
double hi=rt(age,k-1), lo=rt(age,k);
if (hi<lo) swap(hi,lo); lo/=k; hi*=k;
return md(lo,hi);
}
};
Medium(450): CandyBox
- DP
- D種類C個ずつ、でN=CD([2..5000])個
- 10000回シャッフル
- N個から2つ選ぶ nC2 通りのパターンの平均って
- ((nC2 - n)p_i + ∑p_i)/n みたいに出るので計算は意外と楽
- 最悪ケースでもTLEしないのを確認してsubmit
- 235.35pts (34'41'')
#define sz(a) int((a).size())
#define pb push_back
#define all(c) (c).begin(),(c).end()
#define tr(c,i) for(typeof((c).begin()) i=(c).begin(); i!=(c).end(); i++)
#define rep(var,n) for(int var=0;var<(n);var++)
#define found(s,e) ((s).find(e)!=(s).end())
#define remove_(c,val) (c).erase(remove((c).begin(),(c).end(),(val)),(c).end())
class CandyBox {
int c,d,cd;
vector<vector<double> > gen;
void swapgen(int g){
int g0=g%2, g1=(g+1)%2, c=cd*(cd-1)/2; // assert(cd > 1)
double sum=0; rep(i,cd){ sum+=gen[g0][i]; }
rep(i,cd) {
gen[g1][i] = gen[g0][i] * (c-cd) + sum;
gen[g1][i] /= c;
}
}
vector<double> count(int g){
vector<double> ans(d,0);
g %= 2;
rep(i,d) {
rep(j,c) {
ans[i] += gen[g][c*i+j] / c;
}
}
return ans;
}
public:
vector<double> expectedScore(int C, vector<int> score, int S) {
c=C, d=sz(score), cd=c*d;
gen.resize(2); gen[0].resize(cd); gen[1].resize(cd);
int e=0; rep(i,d) rep(j,c){ gen[0][e++] = score[i]; }
rep(i,S) swapgen(i);
return count(S);
}
};
Hard(1000): WarTransportation
- 残り5分。
- 開いた。
- 引数をパースして隣接行列つくるところまで
Challenge Phase
- 250点が撃墜ゲー
- 20人中15人撃墜される
- wataさん他部屋の人に何度も撃たれるが生き残る
- 手に汗握った
- Challenge生き延びて93位。初の2桁行けるか?
System Test
- 250点まだまだ落ちる
- 結局部屋で3人だけ残った。全体でも生存者40人ちょい
- 250,450ともに生き残る
- 62位!初の2桁!
結果
Room: 4/19
Div1: 62/544
1371→1537 (+166) 何度目だ黄色(…超うれしい)
コメント
トラックバック - https://topcoder-g-hatena-ne-jp.jag-icpc.org/n4_t/20100218



