题目描述
纪昌学射,贵在坚持!
纪昌学射于飞卫,三年后技成。一箭射出,可在平面内沿任意路径穿透任何目标飞向终点。飞卫对纪昌的箭术进行检查,方法如下:天上有大鸟(假设静止,都在平面XOY上)A只,纪昌站在原点O开弓射之,箭需落在X轴正半轴上B点处;若箭经过的路径S长度为L,则要求S与X轴围成的平面图形的面积是所有长度为L的射箭路径所围的面积中最大的。飞卫给定X轴正半轴上一个B点,试问纪昌能射中多少只大鸟(大鸟的坐标在S上被认为射中)?
输入
输入有多组(不超过100)测试实例。
每组测试实例第一行为2个正整数A和B(1 ≤ A,B ≤ 10000),分别表示天上的大鸟数量和落箭的位置。第二行为A只大鸟的坐标(先X轴,后Y轴)依次排列,所有的坐标值均为非负整数。
输入结束将由一行A和B均为0的测试实例表示,不应处理此测试实例。
输出
每组测试实例输出一行,为一个整数,即纪昌按飞卫的检查方法所射中的大鸟只数。
样例输入
2 2
1 1 2 2
0 0
样例输出
1
解析:''若箭经过的路径S长度为L,则要求S与X轴围成的平面图形的面积是所有长度为L的射箭路径所围的面积中最大的'',其实就是说射箭轨迹是半圆。然后射中鸟就是鸟在该圆上,那我们利用圆的公式就可以解决此题。
#include <stdio.h>
int main()
{double n,i,k,l,x,y;long long sum;while(~scanf("%lf%lf",&n,&l)){ //n是几只鸟,l是箭落x轴上的位置 sum=0; //计射中几只鸟 if(n==0&&l==0) break;for(i=0;i<n;i++){scanf("%lf%lf",&x,&y); //输入坐标 if((x-l*1.0/2)*(x-l*1.0/2)+y*y==(l*1.0/2)*(l*1.0/2)) sum++;} // 圆的公式 :(x-a)2+(y-b)2=R2printf("%lld\n",sum);}return 0;
}