傲斗凌天2.43葬月之芯:下面有一个Pascal的有趣赛题:抗日英雄谱(第1个题,高手们来看看,有赏分)

来源:百度文库 编辑:查人人中国名人网 时间:2024/04/27 21:07:05
抗日英雄传

1: 山头狙击战
题目描述:
Lucky为了掩护大部队,单枪匹马同敌人周旋,后来被敌人包围在某山头……等等,为什么怎么听怎么像狼牙山五壮士!不过,这次Lucky携带了足够的弹药,完全可以将涌上来的敌人一个一个干掉。Lucky是个神枪手,只要他的枪膛中有子弹,他就能将在他射程m(用从敌人位置到山头的直线距离算)以内的一个敌人射杀。但如果在射程内没有敌人,出于节约子弹考虑和面子问题,Lucky会等待敌人靠近然后射击。Lucky忽然发现了一个致命的失误:他携带的枪是单发枪,每射出一发子弹都必须花k秒钟的时间装子弹。而凶残的敌人才不会花时间等你换子弹。他们始终在以1m/s的速度接近山头。而如果在一个敌人到达山头时Lucky无法将他击毙,那么我们的Lucky就将牺牲在敌人的刺刀下。现在Lucky用心灵感应向你发出求助:要保住自己的性命并且歼灭所有敌人,Lucky最多只能用多少时间给枪装上一发子弹?
说明:假设一开始Lucky的枪中就有一发子弹,并且一旦确定一个装弹时间,Lucky始终会用这个时间完成子弹的装卸。希望你能帮助Lucky脱离险境。
数据说明:
针对每组输入数据,第一行有两个整数n和m,(2≤n≤100,000; 1≤m≤10,000,000)n代表敌人个数,m代表Lucky的射程。
接下来有n行,每行一个整数mi,(1≤mi≤10,000,000),代表每个敌人一开始相对山头的距离(单位为米)。

每组输出数据仅有一个整数,代表Lucky的换弹时间(单位为秒)。
样例输入(shoot.in):
6 100
236
120
120
120
120
120
样例输出(shoot.out):
25
题后剧情:
Lucky最终在您的帮助下歼灭了所有包围他的敌人,在保证了大部队安全的情况下,还缴获了大量敌军的精良装备。这次战斗,大大地挫退了敌人的嚣张气焰,大大地鼓舞了我军的士气。从此, Lucky也踏上了他的英雄之路。

附录:我说明一下,请把编出的程序加在回答中,做出1题追加20分,必须在11月14日以内(9:00以后不行),如果在以后任意14天编出,奖赏分1题降至10分.总结一下,当天编出的人共加:20+20+10=50分
以后编出的人:20+10=30分
紫杉学者有全权解释的权力,望大积极参与.
注意:还有第二题,第三题,第四题,将在今日不同时间推出,留心观察.

var n,d,s,t,i,j,k:longint;
a:array[0..100000]of longint;

procedure sort(l,r:longint);
var i,j,min,temp:longint;
begin
i:=l;j:=r;min:=a[(l+r) div 2];
repeat
while a[i]<min do inc(i);
while a[j]>min do dec(j);
if i<=j then
begin
temp:=a[i];a[i]:=a[j];a[j]:=temp;
inc(i);dec(j);
end;
until i>j;
if i<r then sort(i,r);
if j>l then sort(l,j);
end;

begin
assign(input,'shoot.in');
reset(input);
assign(output,'shoot.out');
rewrite(output);
readln(n,s);
for i:=1 to n do readln(a[i]);
sort(1,n);
if a[1]>s then
begin
d:=a[1]-s;
for j:=1 to n do a[j]:=a[j]-d;
end;
a[1]:=s;
t:=a[2];k:=1;
for i:=3 to n do
begin
if a[i]-a[i-1]+s<t then
t:=a[i]-a[i-1]+s;
if (a[i]-a[k]+s) div (i-k)<t then
t:=(a[i]-a[k]+s) div (i-k);
if t*(i-k-1)+a[k]<=a[i-1] then k:=i-1;
end;
writeln(t);
close(input);
close(output);
end.

题挺好,没看懂