10451 - Ancient Village Sports

http://uva.onlinejudge.org/external/104/10451.html

問題概要

多角形の微妙なところの面積を求めよう。

コード

#include<iostream>
#include<cmath>
#include<cstdio>

using namespace std;
const double pi = 2*acos(0);

inline double AreaOfCircle(double r){
  return r * r * pi;
}

int main(){
  int tc = 0;
  while(true){
    int n;
    double A;
    cin >> n >> A;
    if( n < 3 ) break;
    //cout << n << A << endl;
    double spector_r = sqrt( (2*A/n)/(sin((2*pi)/n)) );
    double official_r = spector_r * cos( pi / n );
    double official = A - AreaOfCircle( official_r );
    double spector = AreaOfCircle( spector_r ) - A;
    ++tc;
    printf("Case %d: %.5lf %.5lf\n",
	   tc,
	   spector,
	   official );
  }
  return 0;
}

解法

多角形を三角形にわけ、面積の、半径に関する式を出す。あとはその半径を利用して、小さいほうの面積計算で必要な半径も出す。