题目链接:http://poj.org/problem?id=1031
题目大意:
略
题目解析:
求原点能够照射多边形的最大角度,该角度是弧度制下的夹角
AC代码:
#include<iostream>
#include<algorithm>
#include<math.h>
#include<stdio.h>
using namespace std;
const int maxn=105;
const double pi=acos(-1.0);
struct Point{
double x,y;
Point(double x=0,double y=0):x(x),y(y){}
};
typedef Point Vector;
double Dot(Vector A,Vector B){
return A.x*B.x+A.y*B.y;
}
double Length(Vector A){
return sqrt(Dot(A,A));
}
double Angle(Vector A,Vector B){
return acos(Dot(A,B)/Length(A)/Length(B));
}
Point p[maxn];
int main(){
double k,h;
int N;
cin>>k>>h>>N;
// cout<<k<<h<<endl;
// cout<<N<<endl;
for(int i=0;i<N;i++){
cin>>p[i].x>>p[i].y;
// cout<<"&"<<endl;
}
// cout<<"*"<<endl;
p[N].x=p[0].x;
p[N].y=p[0].y;
double sum=0;
double mn=0;
double mx=0;
for(int i=0;i<N;i++){
double temp=Angle(p[i],p[i+1]);
sum+=temp;
// cout<<temp<<"*"<<endl;
// cout<<sum<<"@"<<endl;
if(sum>0){
mx=max(sum,mx);
}else{
mn=min(sum,mn);
}
if(mx-mn>=2*pi){
mx=mn+2*pi;
break;
}
// cout<<mx<<"?"<<endl;
// cout<<mn<<endl;
}
// cout<<Angle(p[N-1],p[N])<<"*"<<endl;
printf("%.2lf\n",k*h*(mx-mn));
return 0;
}