Java 从一组给定的直线出发,如何找到位于任意直线上的点,在特定的x上具有最小的y坐标?
一个简单的解决方案是迭代每个直线方程(~1e5个),用给定值替换“x”,获得“y”,并将该“y”与从其他直线方程获得的“y”进行比较。但是,如果查询数量很大(~1e5),此解决方案将无法在时间限制内完成。是否有任何有效的方法可以找到特定“x”的最小“y” 失败的JAVA代码:Java 从一组给定的直线出发,如何找到位于任意直线上的点,在特定的x上具有最小的y坐标?,java,geometry,Java,Geometry,一个简单的解决方案是迭代每个直线方程(~1e5个),用给定值替换“x”,获得“y”,并将该“y”与从其他直线方程获得的“y”进行比较。但是,如果查询数量很大(~1e5),此解决方案将无法在时间限制内完成。是否有任何有效的方法可以找到特定“x”的最小“y” 失败的JAVA代码: import java.util.Scanner; class Competitive_Programming { static Scanner sc = new Scanner(System.in);
import java.util.Scanner;
class Competitive_Programming
{
static Scanner sc = new Scanner(System.in);
static int N, M;
static StLine[] lines;
public static void main(String[] args)
{
int i, j;
N = sc.nextInt(); // Number of straight lines (~1e5)
lines = new StLine[N];
for(i = 0; i < N; ++i)
{
double m = sc.nextDouble(); // slope
double c = sc.nextDouble(); //y-intercept
lines[i] = new StLine(m, c);
}
M = sc.nextInt(); // Number of queries (~1e5)
for(i = 0; i < M; ++i)
{
double x = sc.nextDouble(); // The X co-ordinate
double minY = Double.MAX_VALUE;
for(j = 0; j < N; ++j)
minY = Math.min(minY, lines[j].YatX(x));
System.out.println(minY); // Minimum Y co-ordinate
}
}
}
class StLine
{
double slope, yintercept;
StLine(double m, double c)
{
slope = m; yintercept = c;
}
double YatX(double x)
{
return x * slope + yintercept;
}
}
import java.util.Scanner;
类竞争程序设计
{
静态扫描仪sc=新扫描仪(System.in);
静态int N,M;
静态StLine[]行;
公共静态void main(字符串[]args)
{
int i,j;
N=sc.nextInt();//直线数(~1e5)
行=新的StLine[N];
对于(i=0;i
任何x的最低y轨迹都是一条凸多段线,最多有N-1个顶点
您可以通过一次添加一行来增量构造它。用简单的方法更新多段线并不困难:对于每个线段,检查它是否穿过新线,只保留“下方”部分。确保保持顶点从左到右的顺序
我怀疑这种操作可以通过类似二分法的过程更有效地完成,但这需要更复杂的数据结构
获得最终多段线后,需要进行简单的二分法搜索才能找到给定x的y
您能分享耗时太长的代码吗?如果这是一个编程问题,请包括一种语言。如果这是一个纯粹的数学问题,我甚至认为通过某种形式的对偶,构造可以转化为点集的凸包问题,这很容易在时间O(N logn)内解决。