kmjp's blog

競技プログラミング参加記です

Donutsプロコンチャレンジ2015 : A - ドーナツの体積、B - Tokyo 7th シスターズ

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である軸を中心に回転させると、ドーナツ状の図形ができる。
この図形の体積を求めよ。

幸い、パップス=ギュルダンの定理が問題文で与えられているので代入するだけ。
 (2*\pi*D) * (R^2 * \pi)を求めればよい。
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良く当たるなー。