当前位置: 代码迷 >> 综合 >> ZCMU--5194: 纪昌学射(C语言)
  详细解决方案

ZCMU--5194: 纪昌学射(C语言)

热度:45   发布时间:2023-12-06 10:10:23.0

题目描述

纪昌学射,贵在坚持!

纪昌学射于飞卫,三年后技成。一箭射出,可在平面内沿任意路径穿透任何目标飞向终点。飞卫对纪昌的箭术进行检查,方法如下:天上有大鸟(假设静止,都在平面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;
}