讨论 / 哪出啦, 诚请帮忙,如能看一下,不胜感激
没13 2010-11-04 02:17:00
点我顶贴 收藏 删除
program jsp;

type

rec=record

x,y:integer;

end;

var

a:array[1..20] of integer;

f:array[1..20,0..20] of boolean;

mand:array[1..20,1..20] of integer;

time:array[1..20,1..20] of integer;

timemand:array[1..20] of integer;

used:array[1..20] of rec;

turn:array[1..400] of rec;

ff:boolean;

k,n,m,i,j,q,ans,min,t:integer;

begin

assign(input,’jsp.in’);

assign(output,’jsp.out’);

reset(input);

rewrite(output);

readln(m,n);

for i:=1 to m*n do begin

read(q);

inc(a[q]);

turn[i].x:=q;

turn[i].y:=a[q];

end;

for i:=1 to n do

for j:=1 to m do

read(mand[i,j]);

for i:=1 to n do

for j:=1 to m do

read(time[i,j]);

fillchar(f,sizeof(f),false);

fillchar(timemand,sizeof(timemand),0);

for i:=1 to n do f[i,0]:=true;

t:=0;

repeat

k:=0;

repeat

inc(k); ff:=true;

if not f[turn[k].x,turn[k].y] and f[turn[k].x,turn[k].y-1] and

(timemand[mand[turn[k].x,turn[k].y]]=0) then break;

ff:=false;

until k=n*m;

if not ff then begin

min:=maxint;

for j:=1 to m do

if (timemand[j]>0) and (timemand[j]<min) then min:=timemand[j];

inc(ans,min);

for j:=1 to m do

if timemand[j]>0 then begin dec(timemand[j],min);

if timemand[j]=0 then f[used[j].x,used[j].y]:=true; end;

end else

begin

inc(t);

timemand[mand[turn[k].x,turn[k].y]]:=time[turn[k].x,turn[k].y];

used[mand[turn[k].x,turn[k].y]].x:=turn[k].x;

used[mand[turn[k].x,turn[k].y]].y:=turn[k].y;

min:=maxint;

for j:=1 to m do

if min>timemand[j] then min:=timemand[j];

if min>0 then begin

inc(ans,min);

for j:=1 to m do begin

dec(timemand[j],min);

if timemand[j]=0 then f[used[j].x,used[j].y]:

end;

end;

end;

until t=n*m;

min:=0;

for j:=1 to m do if timemand[j]>min then min:=timemand[j];

writeln(ans+min);

close(input);

close(output);

end.

我的想法是每次从操作序列从前到后找一个能进行操作的,并不断累计最小时间,timemand记录每台机器目前的状态,f表是每个操作的状态, 但是只过了三个点

通过本测试点|有效耗时171ms

测试结果2: 通过本测试点|有效耗时47ms

测试结果3: 通过本测试点|有效耗时47ms

测试结果4: 测试结果错误.错误结果为:44

正确结果应为:47

测试结果5: 测试结果错误.错误结果为:46

正确结果应为:45

测试结果6: 测试结果错误.错误结果为:98

正确结果应为:109

测试结果7: 测试结果错误.错误结果为:103

正确结果应为:116

测试结果8: 测试结果错误.错误结果为:156

正确结果应为:185

测试结果9: 测试结果错误.错误结果为:229

正确结果应为:233

测试结果10: 测试结果错误.错误结果为:258

正确结果应为:286

如能看一下,不胜感激

#1 zhhyoi@2009-08-30 07:24:00
回复 删除
都比正确答案小,说明有的工作时间重复
#2 L.Lawliet@2010-10-29 05:52:00
回复 删除
我跟LZ是一个思路。。也只过了3个点。。

工作时间没有重复 我认为题目叙述中的方法并不是最有的

或者是我的程序有待完善 哪位神牛谁帮帮忙啦

const maxn=20;max2n=400;maxm=20;

var sw:array[0..maxm]of longint;

sx:array[0..maxn,0..maxm]of boolean;

ch,ti:array[0..maxn,0..maxm]of longint;

nn,mm:array[0..max2n]of longint;

mark:array[0..max2n]of boolean;

kk:array[0..maxn]of longint;

work:array[0..maxm]of longint;

doing:array[0..maxn]of boolean;

i,j,k,m,n:longint;

ans:dword;

{main}

begin

readln(m,n);

for i:=1 to n do kk[i]:=0;

for i:=1 to m*n do

begin

read(k);

inc(kk[k]);

nn[i]:=k;

mm[i]:=kk[k];

end;

readln;

for i:=1 to n do

begin

for j:=1 to m do

read(ch[i,j]);

readln;

end;

for i:=1 to n do

begin

for j:=1 to m do

read(ti[i,j]);

readln;

end;

ans:=0;

for i:=1 to m do sw[i]:=0;

fillchar(mark,sizeof(mark),false);

fillchar(sx,sizeof(sx),false);

fillchar(doing,sizeof(doing),false);

for i:=1 to n do sx[i,0]:=true;

{work}

{test}

while true do

begin

for i:=1 to m do

begin

if sw[i]=0 then

begin

mark[work[i]]:=true;

sx[nn[work[i]],mm[work[i]]]:=true;

doing[nn[work[i]]]:=false;

for j:=1 to m*n do

if (not mark[j])and(not doing[nn[j]])and(sx[nn[j],mm[j]-1])and(ch[nn[j],mm[j]]=i) then

begin

work[i]:=j;

sw[i]:=ti[nn[j],mm[j]]-1;

doing[nn[j]]:=true;

if j<>m*n then break;

end;

end

else

begin

dec(sw[i]);

if sw[i]=0 then mark[work[i]]:=true;

end;

end;

{ for j:=1 to m do write(sw[j],' ');writeln('sw');

for j:=1 to m do write(nn[work[j]],' ',mm[work[j]],';');writeln('work');

for j:=1 to n*m do write(mark[j],' ');writeln; }

inc(ans);

for i:=1 to n*m do if mark[i]=false then break;

if (i=n*m)and(mark[i]) then

begin

writeln(ans);

halt;

end;

end;

end.

#3 yiyu9261wsx@2010-11-04 02:17:00
回复 删除
回复 板凳L.Lawliet 的帖子

题目理解有问题,我再题解里写了

查看更多回复
提交回复