pascal问题:智力大冲浪

来源:百度知道 编辑:UC知道 时间:2024/07/04 10:40:48
例2:智力大冲浪
小伟报名参加中央电视台的智力大冲浪节目。

本次挑战赛吸引了众多参赛者,主持人为了表彰大家的勇气,先奖励每个参赛者m元,先不要太高兴!因为这些钱还不一定就是你的,接下来主持人宣布了比赛规则。
首先,比赛时间分为n个时段(n<=500),它又给出了很多小游戏,每个小游戏都必须在规定期限Ti前完成(1=<Ti<=n)。如果一个游戏没能在规定的期限前完成,则要从奖励费m元中扣去一部分钱Wi,Wi为自然数,不同的游戏扣去的钱是不一样的,当然,每个游戏本身都很简单,保证每个人都能在一个时段完成,而且都必须从整数段开始,主持人只是想考考参赛者如何安排组织自己做游戏的顺序,作为参赛者,小伟很想赢得冠军,当然更想赢取最多的钱,注意,比赛绝不让参赛者赔钱
[问题输入]
输入文件in.txt,共4行。
第1行为m,表示一开始奖励给每位参赛者的钱;
第2行为n,表示有n个小游戏;
第3行有n个数,分别表示游戏1到n的规定完成期限;
第4行有n个数,分别表示游戏1到n不能在规定期限前完成的扣款数。
[问题输出]
输出文件out.txt,仅1行。表示小伟能赢取最多的钱。
[输入样例]
10000
7
4 2 4 3 1 4 6
70 60 50 40 30 20 10
[输出样例]
9950

以下为本人所编程序,但运行出来结果不正确,请高手帮忙!谢谢 !

program zldcl;
var a,b,c:array[1..500] of integer;
m,n,i,j,x,s:integer;
f1,f2:text;
procedure move;
var i,j,g,h:integer;
begin
g:=c[1];
for i:=1 to s do
if c[i]<g then begin g:=c[

首先排序时用m替换会覆盖m原来的值,改成t
从前往后扫描,一旦a[i]>b[i]则move,下一次应该从i继续扫描,所以这里用for循环不好做,用while简单一些;我在程序上做了一些改动:
program zldcl;
var a,b,c:array[1..500] of integer;
m,n,i,j,x,s,t:integer;
f1,f2:text;
procedure move(s:integer); //
var i,j,g,h:integer;
begin
g:=c[1];
for i:=1 to s do
if c[i]<g then begin g:=c[i];h:=i;end;
m:=m-g;
for j:=h to n do begin b[j]:=b[j+1];c[j]:=c[j+1];end; //
dec(n); //
end;

begin
assign(f1,'in.txt');
reset(f1);
read(f1,m);read(f1,n);
for i:=1 to n do
begin
a[i]:=i;
read(f1,b[i]);
end;
for i:=1 to n do read(f1,c[i]);
close(f1);
s:=n;
for i:=1 to n-1 do
for j:=i to n do
if b[i]>=b[j] then
begin
t:=b[i];b[i]:=b[j];b[j]:=t;
t:=c[i];c[i]:=c[j];c[j]:=t;
end;
//for i:=n downto 1 do if a[i]>b[i] then move;
i:=1; //
while i<n do //
begi