登山机器人问题(本题满分40分)(福建04年省选题目)noip提高组难度

 

登山机器人问题(本题满分40分)(福建04年省选题目)noip提高组难度

?问题描述:

登山机器人是一个极富挑战性的高技术密集型科学研究项目。它涉及小车机械、飞行器控制、机器人学、机电一体化、单片机、数据融合、精密仪器、实时数字信号处理、图像处理与图像识别、知识工程与专家系统、决策、轨迹规划、自组织与自学习理论、多智能体协调、以及无线通讯等多项理论和技术,是一个典型的智能机器人系统。登山机器人为研究发展多智能体系统和多机器人之间的合作与对抗提供了生动的研究模型。

登山机器人可以携带有限的能量。在登山过程中,登山机器人需要消耗一定能量,并且可以在机器人之间通过接触传递能量。用多个登山机器人接力登山可以极大地提高登山机器人的攀登高度。

?编程任务:

给定n个登山机器人(1)。第i个登山机器人最多可以携带xi单位的能量,每攀高1米需要消耗能量yi单位。开始登山时n个登山机器人均处于同一水平高度0,并且每个登山机器人初始时都携带了最多的能量。计算用这n个登山机器人进行不返回的接力登山可攀登的最高的高度。

?数据输入:

输入数据由文件名为INPUT3.*的文本文件提供。

n 1行中的整数为登山机器人个数n

n 接下来的n行中每行一个整数,依次为x1,x2,x3,...,xn

n 最后的n行中每行一个整数,依次为y1,y2,y3,...,yn

?结果输出:

程序运行结束时,在屏幕上输出所找到的这n个登山机器人可攀登的最高的高度,精确到小数点后2位。

输入文件示例

输出示例

INPUT3.001

7500.00

50

50

0.01

0.01

 (这个地儿题目都说了保留两位,数据却没写上= =)

 题解:拿两个机器人的推广一下:

易想到尽量将燃料用完,尽量让耗油少的用,依此思路进行推导。

当有两个机器人时,临界条件就是2号剩余的油恰好能够把1号的油箱给装满

时,2号剩余的1号消耗的,此时可将2号的油传给1号,就又可上升x1/y1

假设x1/y1+x2/(y1+y2)>x2/y2+x1/(y1+1y2),化简后,可得到x1/y1^2>x2/y2^2

这样将所化简的关键字排序后,贪心选取即可得到最优值。

选取的方法为每次把x[i]/y[i]^2最小的数丢掉,因为已经排序,所以把它的油加到前面i-1个里面。像前面一样,在临界条件,得到一个恰好把剩下i-1个的油箱装满时上升的高度h,h:=x[i]/(y[1]+y[2]+...+y[i]);

ac程序:

var x,y:array[0..100] of real;
sum:real;
n,m,i,j,k:longint;
function f(i,j:longint):boolean;
begin
 if x[j]*y[i]*y[i]>x[i]*y[j]*y[j] then
 exit(true);
 exit(false);
end;
begin
 assign(input,'p3.in'); assign(output,'p3.out');
 reset(input); rewrite(output);
 readln(n);
 for i:=1 to n do
  readln(x[i]);
 for i:=1 to n do
  readln(y[i]);
 for i:=1 to n-1 do
  for j:=i+1 to n do
   if f(i,j) then
    begin
     sum:=x[i]; x[i]:=x[j]; x[j]:=sum;
     sum:=y[i]; y[i]:=y[j]; y[j]:=sum;
    end;
 for i:=2 to n do
  y[i]:=y[i-1]+y[i];
 sum:=0;
 for i:=1 to n do
  sum:=sum+x[i]/y[i];
 writeln(sum:0:2);
 close(input); close(output);
end.


 


 

 

你可能感兴趣的:(S!,恶心的题目,离散化,input,output,图像处理,通讯,任务,编程)