yukicoder No.105 - arcの六角ボルト

Source

ニコニコミュニティ
問題文

問題概要

原点中心,頂点の一点が $(1,0)$ の正六角形を考える.
それを原点中心,反時計回りに $0$ 度以上 $50$ 度未満回転した後の,各頂点の座標が与えられる.
ただし,与えられる座標には,微小の誤差が含まれている可能性がある.
何度回転したものかを求める問題.

解法

各頂点が原点から何度回った部分にあるかを,例えば,arctanなどを用いて計算する.
その中で,一番,$0$ 度以上,$50$ 度未満っぽい角度を答えれば良い.
もしくは,$1$ つの頂点についてだけ角度を求め,$0$ 度以上 $50$ 度未満っぽい角度になるまで,$60$ 度を足し引きすれば良い.
ただし,座標には誤差が含まれるので,厳密に $0$ 度以上,$50$ 度未満になるとは限らず,ある程度誤差を許容するようにしなければいけない.

C++によるスパゲッティなソースコード

#include<bits/stdc++.h>
using namespace std;

#define REP(i,a,b) for(i=a;i<b;i++)
#define rep(i,n) REP(i,0,n)

int main(){
  int i, j, k;
  int T;
  double X, Y, th, pi = acos(0)*2;
  double res;

  scanf("%d",&T);
  while(T--){
    res = 1e10;
    rep(i,6){
      scanf("%lf%lf",&X,&Y);
      th = atan2(Y,X);
      if(th < -1e-9) continue;
      res = min(res, th);
    }
    res = res * 180 / pi;
    printf("%.16f\n",res);
  }
  
  return 0;
}

Current time: 2017年07月21日13時34分27秒
Last modified: 2014年12月24日00時22分21秒 (by laycrs)
Tags: Competitive_Programming yukicoder
トップページに戻る

Logged in as: unknown user (not login)

ログイン: