讨论 / 为什么才80
cszqwe 2011-09-11 05:52:00
点我顶贴 收藏 删除
由于本人很菜,不理解压缩范围,所以直接用的1-10的最小公倍数2520,结果才80(我没考虑S=T,我认为这样应该不需要考虑)求牛解答

program da;

var a:array[0..101]of longint;

f,b:array[-10..300000]of longint;

l,s,t,m,i,n,j,k,o,p:longint;

begin

readln(l);

readln(s,t,m);

for i:=1 to m do read(a[i]);

for i:=1 to m do

for j:=i+1 to m do

if a[i]>a[j] then

begin

k:=a[i];

a[i]:=a[j];

a[j]:=k;

end;

a[m+1]:=l;

for i:=1 to m+1 do

begin

if abs(a[i]-a[i-1])>2520 then

begin

o:=a[i]-a[i-1]-2520;

for j:=i to m+1 do

a[j]:=a[j]-o;

end;

end;

l:=a[m+1];

for i:=1 to m do b[a[i]]:=1;

for i:=1 to l do f[i]:=maxint;

for i:=1 to l do

begin

for j:=s to t do

if i-j>=0 then

if f[i]>f[i-j]+b[i] then f[i]:=f[i-j]+b[i];

end;

writeln(f[l]);

end.

#1 Fish、のTorres@2011-03-31 05:33:00
回复 删除
tong 80
#2 cotton@2011-09-11 05:52:00
回复 删除
必须特判

当s==t时,一切决策都是没有意义的,整道题也有DP蜕变成了模拟。

本题中所有的证明都是基于s<t的

我也忘了特判,结果同WA80.补上这段特判就AC了

if (s==t)

{

ans=0;

for (i=1; i<=m; ++i)

{

if ( stone[i] % s==0 )

++ans;

}

printf("%d\n", ans);

exit(0);

}

查看更多回复
提交回复