3129:How I Wonder What You Are!

keyword

空間幾何 C

概要

空間状に星がN(<500)個ある。また原点にライトがM(<50)本ある。各ライトには向き dirと角度 φが設定されていて、星への方向ベクトルとdirのなす角度がφ以下ならその星は照らされる。照らされている星の個数を求める問題。
何の工夫もなく角度を求めるだけ。計算量O(N*M)。あとPKUでGCCを選んだときは-lmがついていることも確認できた。

double sx[501], sy[501], sz[501];
double lx[51], ly[51], lz[51], angs[51];

double getArg(int i, int j){
    return acos((sx[i]*lx[j] + sy[i]*ly[j] + sz[i]*lz[j])
                 /(sqrt(sx[i]*sx[i]+sy[i]*sy[i]+sz[i]*sz[i])*
                   sqrt(lx[j]*lx[j]+ly[j]*ly[j]+lz[j]*lz[j])));
}

int main(){
    int n, m, i, j, ans;
    while(scanf("%d",&n), n){
        for(i=0;i<n;i++) scanf("%lf%lf%lf",sx+i,sy+i,sz+i);
        scanf("%d",&m);
        for(i=0;i<m;i++) scanf("%lf%lf%lf%lf",lx+i,ly+i,lz+i,angs+i);

        ans = 0;
        for(i=0;i<n;i++){
            for(j=0;j<m;j++){
                if( getArg(i,j) < angs[j] ){
                    ans++;
                    break;
                }
            }
        }

        printf("%d\n",ans);
    }
}