题解

99 条题解

  • 0
    @ 2009-11-03 09:14:13

    感谢xuxun....

    我wa了n次==

  • 0
    @ 2009-11-02 18:58:36

    实践证明 在PASCAL里要这样

    function mod10(x:longint):longint;

    begin

    exit(((x mod 10)+10)mod 10);

    end;

  • 0
    @ 2009-11-02 10:42:58

    用一个for 处理环形。。

    精简版。

    program number;

    var fmin,fmax,sum:array[0..50,0..50]of longint;

    b,a:array[0..50]of longint;

    i,j,n,m:longint;

    max,min:int64;

    procedure doit;

    var i,j,k:longint;

    begin

    filldword(fmin,sizeof(fmin)div 4,55555555);

    fillchar(fmax,sizeof(fmax),0);

    for i:=1 to n do

    begin

    fmin:=sum[1,i];fmax:=sum[1,i];

    end;

    for k:=1 to m-1 do

    for i:=k+1 to n do

    for j:=1 to i-1 do

    begin

    if fmaxfmin[j,k-1]*sum[j+1,i]then

    fmin:=fmin[j,k-1]*sum[j+1,i];

    end;

    if fmax[n,m-1]>max then max:=fmax[n,m-1];

    if fmin[n,m-1]

  • 0
    @ 2009-10-30 23:46:45

    DP+每个数循环做头

    开始sum加上10000没过

    后来加上10000*50就过了

    要仔细!!!

  • 0
    @ 2009-10-28 13:22:59

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    将N个数拉成2N个数的链,秒杀

  • 0
    @ 2009-10-27 10:01:27

    必须int64!

    害我没一遍AC!

  • 0
    @ 2009-10-23 08:43:38

    AC50

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    环形DP

    分成P部分

    第i到j间分成P部分的最大、最小值

    Ai..Ak分成P-1部分,Ak+1..N分成1部分的最大、最小值

    就酱子

    program ex;

    var i,j,n,m,max,min:longint;

    g,fmax,fmax1,fmin,fmin1:array[0..50,0..50]of longint;

    procedure init;

    var i,j:longint;

    begin

    readln(n,m);

    for i:=1 to n do

    begin

    readln(g);

    g:=(g mod 10 +10) mod 10;

    fmax1:=g;

    fmin1:=g;

    end;

    for i:=1 to n do

    for j:=i+1 to n do

    begin

    g:=(g+g[j,j]) mod 10;

    fmax1:=g;

    fmin1:=g;

    end;

    end;

    procedure dp;

    var i,j,k,p:longint;

    begin

    for p:=2 to m-1 do

    begin

    filldword(fmin,sizeof(fmin)div 4,maxint);

    fillchar(fmax,sizeof(fmax),0);

    for i:=1 to n do

    for j:=i to n do

    for k:=i to j-1 do

    begin

    if fmax1*g[k+1,j]>fmax then

    fmax:=fmax1*g[k+1,j];

    if (fmin1>=0)and(fmin1*g[k+1,j]max then

    max:=fmax1*((g[j+1,n]+g[1,i-1])mod 10);

    if fmin1*((g[j+1,n]+g[1,i-1])mod 10)

  • 0
    @ 2009-11-09 18:08:41

    题解 Solution

  • 0
    @ 2009-10-13 21:37:30

    有没有更快的方法???不要n^2*m

  • 0
    @ 2009-10-10 23:57:28

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    小水题

  • 0
    @ 2009-10-06 21:55:29

    -1 mod 10=9 不是-1

    -1 mod 10=9 不是-1

    -1 mod 10=9 不是-1

    -1 mod 10=9 不是-1

    在这里卡了半小时

    如果是负数把他+100000就可以了

  • 0
    @ 2009-10-05 11:28:36

    题目为什么说 -1 mod 10 =9 呢?

    fp输出的是 -1 啊

  • 0
    @ 2009-09-27 22:42:22

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    var a,b:array[0..100]of longint;

    f1,f2:array[0..10,0..52]of longint;

    num:array[0..51,0..51]of longint;

    n,m,i,t,max1,min1,j,k:longint;

    function max(x,y:longint):longint;

    begin

    if x>y then max:=x else max:=y;

    end;

    function min(x,y:longint):longint;

    begin

    if x>y then min:=y else min:=x;

    end;

    begin

    readln(n,m);

    for i:=1 to n do readln(a[i]);

    a[0]:=a[n];

    max1:=-maxlongint;

    min1:=maxlongint;

    for t:=1 to n do

    begin

    fillchar(num,sizeof(num),0);

    fillchar(b,sizeof(b),0);

    fillchar(f1,sizeof(f1),0);

    fillchar(f2,sizeof(f2),0);

    for i:=t to t+n-1 do b:=a[i mod n];

    for i:=1 to n do

    for j:=i to n do num:=(num+((b[j]+10000000) mod 10)) mod 10;

    for i:=1 to n do

    begin

    f1[1,i]:=num[1,i];

    f2[1,i]:=num[1,i];

    end;

    for i:=2 to m do

    for j:=i to n do

    begin

    f2:=maxlongint;

    for k:=i-1 to j-1 do

    begin

    f1:=max(f1,f1*num[k+1,j]);

    f2:=min(f2,f2*num[k+1,j]);

    end;

    end;

    if f1[m,n]>max1 then max1:=f1[m,n];

    if f2[m,n]

  • 0
    @ 2009-09-27 22:38:21

    第5组只有1个数。。

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

  • 0
    @ 2009-09-13 14:57:34

    第四个点很猥琐......差一点超时..619ms

    orz 0ms的大牛

  • 0
    @ 2009-09-12 21:51:39

    program vijos1218;

    var n,m,be,en,maxs,mins,ppp:int64;k,i,ii,jj,j,p:longint;

    a,s:array[0..100]of int64;

    f,g:array[1..100,0..9]of int64;

    function max(a,b:int64):int64;

    begin

    max:=a;

    if b>max then exit(b);

    end;

    function min(a,b:int64):int64;

    begin

    min:=a;

    if b=k then

    for j:=1 to i-1 do

    begin

    f:=max(f[j,k-1]*((((s[i]-s[j])mod 10)+10)mod 10),f);

    g:=min(g[j,k-1]*((((s[i]-s[j])mod 10)+10)mod 10),g);

    end;

    end;

    if f[n,m]>maxs then maxs:=f[n,m];

    if g[n,m]

  • 0
    @ 2009-09-07 12:33:18

    var

    a,s:array[0..1000]of longint;

    f0,f1:array[0..100,0..100]of longint;

    i,j,max,min,p,i1,k,n,m:longint;

    procedure init;

    var

    temp,i:integer;

    begin

    temp:=a[1];

    for i:=1 to n-1 do a[i]:=a;

    a[n]:=temp;

    end;

    procedure intt;

    var

    i,j:integer;

    begin

    s[0]:=0;

    for i:=1 to n do s[i]:=s+a[i];

    for i:=1 to n do

    for j:=0 to m do

    begin

    f0:=10000000;

    f1:=0;

    end;

    for i:=1 to n do

    begin

    f0:=((s[i] mod 10)+10)mod 10;

    f1:=((s[i] mod 10)+10)mod 10;

    end;

    end;

    begin

    readln(n,m);

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

    intt;

    if m=1 then begin writeln(f0[n,1]);writeln(f1[n,1]);halt;end;

    min:=maxlongint;max:=-100000000;

    for i:=1 to n do

    begin

    for i1:=2 to n do

    for k:=1 to m do

    if i1>=k then

    for p:=1 to i1-1 do

    begin

    if ((s[i1]-s[p])mod 10+10)mod 10*f0[p,k-1]f1[i1,k] then

    f1[i1,k]:=((s[i1]-s[p])mod 10+10)mod 10*f1[p,k-1];

    end;

    if f0[n,m]max then max:=f1[n,m];

    init;

    intt;

    end;

    writeln(min);

    writeln(max);

    end.

    动态方程f=前i个数分成k分最佳值.

    f:=max{min}f[j,k-1]*opj[j,i];

  • 0
    @ 2009-09-02 21:49:25

    program mm;

    var

    f,g,f1,g1,we:array[0..100,0..100] of longint;

    i,j,k,l,m,n,max,min,p:longint;

    a:array[0..1000] of longint;

    begin

    assign(input,'game.in'); reset(input);

    assign(output,'game.out'); rewrite(output);

    //F=F*F

    readln(n,m);

    for i:=1 to n do begin

    read(a[i]);

    a:=a[i];

    end;

    for j:=1 to n do

    for i:=1 to 2*n-j+1 do

    f1:=f1+a;

    for j:=1 to n do

    for i:=1 to 2*n-j+1 do begin

    f1:=((f1 mod 10)+10) mod 10;

    g1:=f1;

    end;

    we:=f1;

    for k:=2 to m do begin

    for j:=k to n do

    for i:=1 to 2*n-j+1 do begin

    f:=0;

    g:=maxlongint;

    for p:=k-1 to j-1 do begin

    if fg1*we then

    g:=g1*we;

    end;

    end;

    f1:=f;

    g1:=g;

    end;

    max:=0;

    min:=maxlongint;

    for i:=1 to n do begin

    if f>max then max:=f;

    if g

  • 0
    @ 2009-08-20 14:52:28

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 25ms

    ├ 测试数据 04:答案正确... 306ms

    ├ 测试数据 05:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:331ms

    var

    ax,an:array[1..1000,1..1000] of int64;

    sum,s:array[1..1000] of int64;

    i,j,max,min,n,m,p,k,e,t:longint;

    procedure count(p:longint);

    var

    i,j,e:longint;

    begin

    e:=0;

    for i:=p to n+p-1 do begin e:=e+s[i]; sum[i]:=e; end;

    for i:=n+p to n*2{+p} do sum[i]:=sum;

    end;

    procedure secure;

    var

    i,j,sum:longint;

    begin

    sum:=0;

    for i:=1 to n do inc(sum,s[i]);

    writeln(10-abs(sum mod 10));

    writeln(10-abs(sum mod 10));

    halt;

    end;

    begin

    readln(n,m);

    for i:=1 to n do readln(s[i]);

    p:=0; max:=0; min:=maxlongint; fillchar(an,sizeof(an),$7F);

    for i:=n+1 to 2*n do s[i]:=s;

    if m=1 then secure;

    for p:=1 to n do

    begin

    count(p);

    for j:=p to n+p-1 do

    begin

    ax[p,j]:=(10+(sum[j] mod 10)) mod 10;

    an[p,j]:=(10+(sum[j] mod 10)) mod 10;

    end;

    for i:=p+1 to m+p-1 do

    for j:=p to n+p-1 do

    for k:=i-1 to j-1 do

    begin

    t:=(10+((sum[j]-sum[k]) mod 10)) mod 10 *ax;

    if axt then an:=t;

    end;

    if ax>max then max:=ax;

    if an

  • 0
    @ 2009-08-19 23:03:58

    OMG...这是普及组的...我out了...

信息

ID
1218
难度
5
分类
动态规划 | 环形DP 点击显示
标签
递交数
2837
已通过
1084
通过率
38%
被复制
17
上传者