1089-Strawberry Cake

問題概要

日本語なので略

解法

適当に区間を決めて二分探索する.

実装(C++)

int n;
Polygon P;
double S;

bool input(){
  cin>>n;
  if(n==0)return false;
  P=Polygon(n);
  for(int i=0;i<n;i++)cin>>P[i];
  S=area(P);
  return true;
}

double calc_area(double phi){
  Line t(0,0,cos(phi),sin(phi));
  Polygon p=convex_cut_left(P,t);
  return area(p)/S;
}

void output(double phi){
  cout<<setprecision(15)<<setiosflags(ios::fixed);
  cout<<cos(phi)*100<<" "<<sin(phi)*100<<endl;
}
double D=0.01;
int main(){
  while(input()){
    double low,high,mid;
    double now=0;
    REP(i,1000){
      if(calc_area(now)<=0.5&&calc_area(now+D)>=0.5){
        low=now,high=now+D;
        REP(j,5000){
          mid=(low+high)/2;
          if(calc_area(mid)<=0.5){
            low=mid;
          }else{
            high=mid;
          }
        }
        break;
      }
      now+=D;
    }
    output(mid);
  }
}