3412 - Ray

http://poj.org/problem?id=3412

問題

K層の物質の屈折率と最初の層での角度が与えられる。
最後の層での角度を求めよ。

解法

屈折率と角度の関係式が与えられているのでそのとおりにasinなんかを使って実装する。
asinするべきところが1より大きかったら全反射。

ソース

int main() {
  int n;
  cin >> n;
  double r[n];
  REP(i,n) {
    cin >> r[i];
  }
  double a;
  cin >> a;
  bool f = 1;
  REP(i,n-1) {
    double hoge = r[i]/r[i+1] * sin(a);
    if (hoge < 0 || hoge > 1) {
      f = 0;
      break;
    }
    a = asin(hoge);
  }
  if (f)
    printf("%.5f\n", a);
  else
    cout << "NO" << endl;
}