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
如能看一下,不胜感激
工作时间没有重复 我认为题目叙述中的方法并不是最有的
或者是我的程序有待完善 哪位神牛谁帮帮忙啦
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.