原题链接:
https://ac.nowcoder.com/acm/problem/231656https://ac.nowcoder.com/acm/problem/231656
题目描述
papayapapayapapaya 今天要去赶飞机,因为他实在是太懒了,所以睡过了头,于是他打算使用他的传送门去双流机场.
我们可以把双流机场当作一个圆心为 (x,y),半径为 R 的圆,papaya 的传送门能且仅能把 papaya传送到离起点距离为 k 的终点.
起点和终点不要求为整数,假设 papaya 一开始在 (0,0),他想知道最少使用多少次传送门能到达机场.
万一 papaya 突然发现其实自己一开始就在双流机场呢?谁知道呢?
输入描述:
第一行一个整数 T(1≤T≤105) 表示测试组数。 对于每组测试,包含四个整数 x,y,R,k均为整数。
输出描述:
对于每组测试,输出一个整数,表示 papaya 使用传送门的最少次数。
示例1
输入
1 7 5 2 3
输出
3
这一题刚拿到手的时候就可以写出大概的代码
#include<stdio.h>
#include<math.h>
int main()
{
int n;
double x,y,r,k;
double num;
int sum;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%lf%lf%lf%lf",&x,&y,&r,&k);
num=sqrt(x*x+y*y)-r;
if(num<=0)
printf("0\n");
else
{
sum=ceil(num/k);
printf("%d\n",sum);
}
}
}
但是提交上去的时候不对;
此时就少考虑了一种情况
但一开始k就大于sum+R的时候,操作为两次
就产生了一下的代码
#include<stdio.h>
#include<math.h>
int main()
{
int n;
double x,y,r,k;
double num;
int sum;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%lf%lf%lf%lf",&x,&y,&r,&k);
num=sqrt(x*x+y*y)-r;
if(num<=0)
printf("0\n");
else if(k>sqrt(x*x+y*y)+r)
printf("2\n");
else
{
sum=ceil(num/k);
printf("%d\n",sum);
}
}
}
ac