warp

Description
你是一艘战列巡洋舰的引擎操作人员,这艘船的船员在空间中侦测到了一些无法辨识的异常信号。你的指挥官给你下达了命令,让你制定航线,驾驶战列巡洋舰到达那里。

船上老旧的曲速引擎的速度是0.1AU/s。然而,在太空中分布着许多殖民星域,这些星域可以被看成一个球。在星域的内部,你可以在任何地方任意次跳跃到星域内部的任意一个点,不花费任何时间。

你希望算出到达终点的最短时间。
Input
输入包含多组测试数据。

对于每一组数据,第一行包含一个正整数n,表示殖民星域的数量。

接下来n 行,第i 行包含四个整数Xi,Yi,Zi,Ri,表示第i个星域的中心坐标为(Xi, Yi,Zi),星域的半径是Ri。

接下来两行,第一行包含值Xa,Ya,Za,告诉你当前坐标为(Xa, Ya,Za)。

第二行包含值Xo,Yo,Zo,告诉你目的地坐标为(Xo, Yo,Zo)。

输入以一行单独的-1 结尾。所有坐标的单位都是天文单位(AU)。
Output
对于每一组输入数据,输出一行表示从目前的位置到达指定目的地的最短时间,取整到最近整数。输入保证取整是明确的。
Sample Input
1


20 20 20 1


0 0 0


0 0 10


1


5 0 0 4


0 0 0


10 0 0


-1
Sample Output
100


20
Data Constraint
每个输入文件至多包含10 个测试数据。

对于10% 的数据,n = 0。

对于30% 的数据,0<=n<=10。

对于100% 的数据,0<=n<=100,所有坐标的绝对值<=10000 ,半径r<=10000。

你可以认为,你所在的星区的大小为无限大。
uses math;
var
        a,b,c,d,e,i,j,k:longint;
        f:array[0..101,0..101]of real;
        v:array[0..101,1..4]of longint;
begin
        assign(input,'warp.in');reset(input);
        assign(output,'warp.out');rewrite(output);
        while not eof do
        begin
                readln(a);
                if a=-1 then
                        halt;
                fillchar(v,sizeof(v),0);
                for b:=1 to a do
                        readln(v[b,1],v[b,2],v[b,3],v[b,4]);
                readln(v[0,1],v[0,2],v[0,3]);
                readln(v[a+1,1],v[a+1,2],v[a+1,3]);
                fillchar(f,sizeof(f),0);
                for b:=0 to a+1 do
                begin
                        for c:=0 to a+1 do
                        begin
                                f[b,c]:=sqrt(sqr(v[b,1]-v[c,1])+sqr(v[b,2]-v[c,2])+sqr(v[b,3]-v[c,3]));
                                f[b,c]:=f[b,c]-v[b,4]-v[c,4];
                                if f[b,c]<0 then f[b,c]:=0;
                        end;
                end;
                for k:=0 to a+1 do
                begin
                        for i:=0 to a+1 do
                        begin
                                for j:=0 to a+1 do
                                begin
                                        f[i,j]:=min(f[i,k]+f[k,j],f[i,j]);
                                end;
                        end;
                end;
                writeln((f[0,a+1]*10):0:0);
        end;
        close(input);
        close(output);
end.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
warp divergence(指变形发散)是计算机图形学中的概念,用于描述在并行计算中的处理器线程之间的差异性。在图形渲染过程中,为了提高性能,常常采用并行计算的方式来对多个像素或顶点进行处理。 然而,不同处理器线程之间的运算速度、内存访问和负载的差异性会导致某些线程完成任务的时间比其他线程更快或更慢。这种差异性被称为warp divergence。 当一个warp(一组连续的线程)中的线程执行不同的代码路径时,就会发生warp divergence。这种情况下,线程无法同时进行计算,需要等待其他线程完成执行,从而影响了整个warp的性能。 常见引起warp divergence的情况包括分支语句(如if/else、switch等),当分支条件不同的时候,不同线程会进入不同的代码分支,从而产生warp divergence。此外,也会发生在访问不连续内存、常量内存的操作中,或者在执行不同的指令集等。 为了避免warp divergence对并行计算的性能造成负面影响,可以采用一些优化技术来减少warp divergence的发生。例如,可以将分支条件相同的线程放在一个warp中,这样它们可以同时执行相同的代码分支。此外,通过合并指令、重新组织数据、考虑内存访问模式等方式,也可以降低warp divergence的风险。 综上所述,warp divergence是计算机图形学中一个重要的概念,用于描述并行计算中处理器线程之间的差异性。理解和优化warp divergence对于提高并行计算性能具有重要意义。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值