标签:测试 return play 测试数据 一个 break time 代码解析 表示
题目是这样的:
2 2 8 6 1 1 4 5 2 10 6 4 5 6 5
1 2
解题思想:
1.输入的每个数,其中有效部分是与边相切的弦,把它看成一个区间。
2,按区间的左边大小,从小到大排序。
3.特殊情况:第一个的左边位置大于0,此时可以输出0,并结束
4.最主要的部分结合代码解析:
具体的代码实现如下:
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
class Water
{
double l;
double r;
}
class cmp implements Comparator<Water>
{
public int compare(Water a,Water b)
{
if(a.l > b.l)
{
return 1;
}
else if(a.l == b.l)
{
if(a.r > b.r)
{
return 1;
}
else if(a.r == b.r)
{
return 0;
}
else
{
return -1;
}
}
else
{
return -1;
}
}
}
public class Main
{
static final int MAX = 10005;
static Water wa[] = new Water[MAX];
public static void main(String []args)
{
Scanner cin = new Scanner(System.in);
int N = cin.nextInt();
for(int i = 0 ; i < N ; i++)
{
int n,w,h;
n = cin.nextInt();
w = cin.nextInt();
h = cin.nextInt();
for(int j = 0 ; j < n ; j++)
{
wa[j] = new Water();
int x,r;
x = cin.nextInt();
r = cin.nextInt();
if(2*r <= h)
{
wa[j].l = 0.0;
wa[j].r = 0.0;
continue;
}
double s = Math.sqrt((r*r*1.0-h*h*1.0/4));
wa[j].l = x*1.0-s;
wa[j].r = x*1.0+s;
}
Arrays.sort(wa,0,n,new cmp());
if(wa[0].l > 0)
{
System.out.print(0 + "\n");
continue;
}
double p = 0.0;//刚开始是0
int cnt = 0;//计数
int q = 0;//下面for循环的起点
while(true)
{
double s = 0.0;//判断是否存在的,以及离得最远的区间
for(int j = q ; j < n && wa[j].l <= p; j++)
{
if(wa[j].r - p > s)
{
s = wa[j].r-p;
q = j;
}
}
if(s != 0)
{
cnt++;
p += s;
q++;
}
else
{
break;
}
}
if(p >= w)
{
System.out.print(cnt + "\n");
}
else
{
System.out.print(0 + "\n");
}
}
}
}
标签:测试 return play 测试数据 一个 break time 代码解析 表示
原文地址:https://www.cnblogs.com/674001396long/p/9739905.html