Codeforces Round #100 A : New Year Table

問題概要

半径Rの円がある。この中に、半径rの円をn個詰めて、それぞれが交わらず、かつ半径Rの円周に接するように配置することができるか求める問題。

解法

キチキチにn個詰められるような半径がいくつになるかを一次方程式で求めることができる。後はrがそのしきい値より小さいかどうかで判定すれば良い。誤差やn=1のコーナーケースに注意。

acceptされたコード

#include <cstdio>
#include <cmath>
using namespace std;

const double EPS = 1e-9;

int r, R, n;

void init(){
	scanf("%d%d%d", &n, &R, &r);
}

bool solve(){
	const double PI = atan(1.0)*4.0;
	if(n == 1){
		return r <= R;
	}
	double s = sin(PI/n), rr = R*s/(1 + s);
	return r < rr + EPS;
}

int main(){
	init();
	puts(solve() ? "YES" : "NO");

	return 0;
}