Donutsプロコンチャレンジ2015は本番不参加のため、別途練習。
約1時間で完答ということでお手頃な難易度。
http://donuts-2015.contest.atcoder.jp/tasks/donuts_2015_1
http://donuts-2015.contest.atcoder.jp/tasks/donuts_2015_2
A - ドーナツの体積
半径Rの円を円の中心からの距離がDである軸を中心に回転させると、ドーナツ状の図形ができる。
この図形の体積を求めよ。
幸い、パップス=ギュルダンの定理が問題文で与えられているので代入するだけ。
を求めればよい。
yukicoder openで類似問題が出たが、yukicoderのものより入力が容易。
No.89 どんどんドーナツどーんといこう! - yukicoder
double R,D; void solve() { int i,j,k,l,r,x,y; string s; double PI=acos(-1); cin>>R>>D; _P("%.12lf\n",2*D*PI*R*R*PI); }
B - Tokyo 7th シスターズ
N人のアイドルから9人を選んでユニットを組む。
ユニットの能力値は、個々のアイドルの基本能力値A[i]の和に、いくつかのコンボ発生によるボーナス値B[i]の和を合わせたものである。
コンボが発生するには、指定されたC[i]人のアイドルのうち3人以上が含まれていなければならない。
ユニットの最大能力値を求めよ。
N人中9人の選び方をbitmaskで総当たりする。
コンボ発生条件は、コンボに必要なアイドル群を同様にbitmaskで表現し、9人の選び方のbitmaskとand値を取って、3bit以上ビットが立っているかで判定できる。
int N,M; int B[100],C[100],I[100]; void solve() { int i,j,k,l,r,x,y; string s; cin>>N>>M; FOR(i,N) cin>>B[i], I[i]=1<<i; FOR(i,M) { cin>>B[i+N]>>C[i+N]; while(C[i+N]--) cin>>x, I[i+N] |= 1<<(x-1); } int ma=0; for(int mask=0;mask<1<<N;mask++) if(__builtin_popcount(mask)==9) { int tot=0; FOR(i,N) if(mask & I[i]) tot+=B[i]; FOR(i,M) if(__builtin_popcount(mask & I[N+i])>=3) tot+=B[N+i]; ma=max(ma,tot); } cout<<ma<<endl; }
まとめ
最近yukicoder良く当たるなー。