http://acm.pku.edu.cn/JudgeOnline/problem?id=1106

http://acm.pku.edu.cn/JudgeOnline/images/1106/1106_1.gif

Код:
#include<stdio.h>
#include<math.h>
#define MAXN 151
#define pi 3.1415926
class POINT {
public:
    double x,y;
};
POINT e[MAXN];
int n;
POINT o;
double r;
bool check[MAXN];
double dist(POINT p1) {
    return(sqrt(double((p1.x-o.x)*(p1.x-o.x)+(p1.y-o.y)*(p1.y-o.y))));
}
double angle(POINT s,POINT e) {
    double cosfi,fi,norm;
    double dsx = s.x - o.x;
    double dsy = s.y - o.y;
    double dex = e.x - o.x;
    double dey = e.y - o.y;
    cosfi=dsx*dex+dsy*dey;
    norm=(dsx*dsx+dsy*dsy)*(dex*dex+dey*dey);
    cosfi /= sqrt( norm );
    if (cosfi >= 1.0 ) return 0;
    else if (cosfi <= -1.0 ) return 0;
    fi=acos(cosfi);
    if (dsx*dey-dsy*dex>0) return fi; 
    return -fi;
}
int solve() {
    int i,j,count1,key=0;
    double temp,dis;
    for(i=1;i<=n;i++) {
        dis = dist(e[i]);
        if(dis<=r) check[i] = 1;
        else check[i] = 0; }
    for(i=1;i<=n;i++) {
        if(check[i]) {                        
            count1=1;
            for(j=1;j<=n;j++) {
                if(i!=j && check[j]) {
                    temp = angle(e[i],e[j]);
                    if(temp>=0.0) count1++;  }
            }            
            if(count1>key) key = count1;  }
    }
    return key;
}
int main() {    
    int i;
    scanf("%lf %lf %lf",&o.x,&o.y,&r);    
    while(r>0.0) {
        scanf("%d",&n);
        for(i=1;i<=n;i++) scanf("%lf %lf",&e[i].x,&e[i].y);
        for(i=0;i<MAXN;i++) check[i] = 0;
        printf("%d\n",solve());
        scanf("%lf %lf %lf",&o.x,&o.y,&r); }
    return 0;
}