题目链接: http://vjudge.net/problem/viewProblem.action?id=18277
这题暴力n^4妥妥的TLE!即使n^3也可能会T
正确的姿势应该是:枚举每个点作为三角形内(或外)的点,按对此点的极角排序,然后从某个点Aj开始,找到从它开始刚好转了超过180度的点,则j点Aj与此间转过的任何两个点组成的三角形都应该不包括中心点。
这样做可能是n^3的复杂度,但如果Aj做完后,Aj+1可以从上一次转过180度的点开始转,这样不就相当于n^2了
#include <stdio.h>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <cmath>
using namespace std;
#define lson o<<1
#define rson o<<1|1
#define max(a,b) (a)>(b)?(a):(b)
#define min(a,b) (a)<(b)?(a):(b)
#define INF 200000000
#define pi acos(-1.0)
#define eps 1e-9
typedef long long ll;
double x[1500],y[1500];
double ang[1500*2];
int main(){
//freopen("s.in","r",stdin);freopen("s.out","w",stdout);
int n,cs=1;
while(scanf("%d",&n) && n){
int i;
double ans=0,s,c;
s=(double)(n-1)*(n-2)*(n-3)/6.0;
c=(double)n*(n-1)*(n-2)/6.0;
for(i=0;i<n;i++)scanf("%lf%lf",&x[i],&y[i]);
if(n<4){
printf("City %d: 0.00\n",cs);
continue;
}
for(i=0;i<n;i++){
int j,k;
for(j=0,k=0;j<n;j++)if(i!=j){
ang[k]=atan2(y[j]-y[i],x[j]-x[i]);
if(ang[k]<eps)ang[k]+=2*pi;
k++;
}
sort(ang,ang+n-1);
for(j=k;j<2*k;j++)ang[j]=ang[j-k]+2*pi;
double temp=0;int pos=1;
for(j=0;j<k;j++){
while(pos<=2*k&&ang[pos]-ang[j]<pi)pos++;
if(pos-j>2)temp+=(pos-j-1)*(pos-j-2)/2.0;
}
ans+=(s-temp)/c;
}
printf("City %d: %.2lf\n",cs,ans);
cs++;
}
return 0;
}
772ms Accepted~