uva 11529 Strange Tax Calculation (几何+计数)

题目链接: 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~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值