虽然好像是一道水题,但写这篇文章的意义在于——我第一次做出了CF的B题啊啊啊啊。
做法就是计算所有卫兵的点与枪的点之间的斜率(其实用叉积做更好一些),然后对斜率排个序,再扫一遍就可以了嘛。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define eps 0.000000001
#define INF 1000000000
struct node{
double x;
double y;
}s[1005];
double Tan[1005];
int n;
int main(){
node g;
while(cin>>n){
cin>>g.x>>g.y;
for(int i=0;i<n;i++){
cin>>s[i].x>>s[i].y;
if(fabs(s[i].x-g.x)<eps){
Tan[i]=INF;
}
else{
Tan[i]=(s[i].y-g.y)/(s[i].x-g.x);
}
}
sort(Tan,Tan+n);
int sum=1;
for(int i=1;i<n;i++){
cout<<Tan[i]<<" "<<Tan[i-1]<<endl;
if(fabs(Tan[i]-Tan[i-1])>eps){
sum++;
}
}
cout<<sum<<endl;
}
return 0;
}