题解

191 条题解

  • 0
    @ 2009-08-23 13:56:32

    赞楼下的~~~(≧▽≦)/~

  • 0
    @ 2009-08-23 13:54:29

    编译通过...

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

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

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

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

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

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

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

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

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

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

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

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

    Rp算法……

    for i:=1 to 100000 do

    begin

    xx:=random(n div 2)+1;

    yy:=0;

    while yy

  • 0
    @ 2009-08-22 16:47:59

    编译通过...

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

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

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

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

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

    ├ 测试数据 06:答案正确... 103ms

    ├ 测试数据 07:答案错误...程序输出比正确答案长

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

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

    ├ 测试数据 10:答案正确... 822ms

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

    Unaccepted 有效得分:90 有效耗时:1231ms

    程序输出比正确答案长---|---|---|什么意思??????

  • 0
    @ 2009-08-21 17:49:00

    编译通过...

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

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

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

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

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

    ├ 测试数据 06:答案正确... 41ms

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

    ├ 测试数据 08:答案正确... 197ms

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

    ├ 测试数据 10:答案正确... 525ms

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

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

    哈哈,不用排序的好伐?

    貼代碼:

    program vijos1153;

    var n,i,j,k,sum,x,y,p,q,min:longint;

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

    f:array[0..5000,0..200] of longint;

    begin

    readln(n);

    for i:=1 to N do begin

    readln(a[i]);

    sum:=sum+a[i];

    end;

    fillchar(f,sizeof(f),0);

    f[0,0]:=1;

    for i:=1 to N do begin

    for j:=sum div 2+100-a[i] downto 0 do

    for k:=0 to N-1 do

    if f[j,k]=1 then f[j+a[i],k+1]:=1;

    end;

    if N mod 2=0 then begin x:=N div 2; y:=N div 2; end;

    if N mod 2=1 then begin x:=N div 2; y:=N div 2+1; end;

    for i:=sum div 2 to sum do

    if (f=1) or (f=1) then

    begin min:=abs(i-(sum-i)); p:=i; break; end;

    for i:=sum div 2-1 downto 1 do begin

    if abs(i-(sum-i))>min then break;

    if ((f=1) or (f=1)) and (abs(i-(sum-i))

  • 0
    @ 2009-08-20 19:46:02

    编译通过...

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

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

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

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

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

    ├ 测试数据 06:答案正确... 181ms

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

    ├ 测试数据 08:答案正确... 540ms

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

    ├ 测试数据 10:运行超时...

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

    Unaccepted 有效得分:90 有效耗时:721ms

    我擦,最后一个点...

    听了某牛哥曰"要排序"云云,结果过了,啊哈哈哈~~~

    编译通过...

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

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

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

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

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

    ├ 测试数据 06:答案正确... 9ms

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

    ├ 测试数据 08:答案正确... 166ms

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

    ├ 测试数据 10:答案正确... 619ms

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

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

    虽然时间上很屎......

    大家一起信春哥吧!

  • 0
    @ 2009-08-15 15:26:31

    第2,3,9个点老错。。

    谁有数据?

    唉 无奈 只能cheat一下了。。

  • 0
    @ 2009-08-14 14:53:43

    编译通过...

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

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

    ├ 测试数据 03:答案错误... ├ 标准行输出 360 ...

     ├ 错误行输出 359 ...

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

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

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

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

    ├ 测试数据 08:运行时错误...|错误号: 1

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

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

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

    Unaccepted 有效得分:80 有效耗时:0ms

    交4次都是80,都错在这两点上。。。搞什么我改来改去是改假的哦

    还有第三个点错了我也就认了,为什么第八个点会爆出来一个运行错误。。。到底是我秀逗了还是机器秀逗了。。。。很愤青地哀号

    最近风声又近,不可以用小号尽情地尝试。。。好想再哭

    我觉得人生失去意义了

  • 0
    @ 2009-08-12 19:58:31

    编译通过...

    ├ 测试数据 02:答案错误...  ├ 标准行输出 30 ...

     ├ 错误行输出 40 ...

    ├ 测试数据 03:答案错误... ├ 标准行输出 360 ...

     ├ 错误行输出 361 ...

    ├ 测试数据 09:答案错误... ├ 标准行输出 106 ...

     ├ 错误行输出 122 ...

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

    Unaccepted 有效得分:70 有效耗时:0ms

    为什么这样子

    其实我很脆弱

    谁能来告诉我

    这道题为啥错

    我只是用01背包的思想

    f[j]表示能不能组成血量为j

    x 代表当前那个人的血量

    for i:=1 to n do

    for j:=4000 downto x do

    if f[j-x] then f[j]:=true

    可我实在不知道怎么做啊

    最后 我cheat了一下.......

    安拉安拉....我也BS我自己....

  • 0
    @ 2009-08-11 21:35:36

    PUPPY真乃神机!!!

  • 0
    @ 2009-08-07 15:35:43

    for i:=q div 2 downto 0 do

    if f[n div 2,i]=true then break;

    if q-i>i then write(i,' ',q-i)else write(q-i,' ',i);

  • 0
    @ 2009-08-10 18:20:40

    其怪,我的DP数组设成 0..1 第七个点过不了(害我提交2次!!!)

    但该成 Boolean 就可以AC咯

    哪位大牛介绍下原因?

    Procedure Main;

    var i,j,k:integer;

    begin

    f[0,0]:=true;

    for i:=1 to n do

    for j:=n div 2 downto 0 do

    for k:=j*40 downto 0 do

    if f[j,k] then

    f[j+1,k+x[i]]:=true;

    for i:=sum div 2 downto 0 do

    if f[n div 2,i] then

    begin

    write(i,' ');

    writeln(sum-i);

    break;

    end;

    end; {关键部分的程序}

    很经典的背包样式题。

    状态转移方程是:

    if (dp[j][k]) dp[j+1][k+a[i]]=1;

    dp[j][k]表示用j个数,能否达到和k;

    其中枚举i,然后DP求解。

    优化时j可从n/2 to 0,因为取一半数,另一半也就已知了。

    输出的时候,(dp[n/2][0 ... sum/2]==1)(sum为总和)中,取得的和与sum/2最接近的输出即可。

  • 0
    @ 2009-08-04 21:24:26

    我靠。。。数组定界错误都有60分。。。

  • 0
    @ 2009-08-01 13:54:53

    编译通过...

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

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

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

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

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

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

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

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

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

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

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

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

    var i,j,k,l,m,n,s0,max,min:integer;

    a:array[0..8000,0..1000] of integer;

    b:array[1..200] of integer;

    c:array[0..8000] of boolean;

    d:array[0..8000,0..1000] of boolean;

    begin

    readln(n);

    fillchar(c,sizeof(c),false);

    c[0]:=true;a[0,1]:=0;a[0,0]:=1;d[0,1]:=true;

    for i:=1 to n do

    read(b[i]);

    for i:=1 to n-1 do

    for j:=i+1 to n do

    if b[i]>b[j] then

    begin l:=b[i];b[i]:=b[j];b[j]:=l;end;

    if n=1 then begin writeln(0,' ',b[1]);halt;end;

    if n=2 then

    begin

    if b[1]

  • 0
    @ 2009-07-30 18:37:59

    背包问题

    f[J][K]表示到j这个点可能用到的个数

    boolean型的数组

    从平均数开始寻找就可以了

  • 0
    @ 2009-07-26 20:30:40

    这 有点难->对于我来说

    但{信春哥,得永生}

    for k:=1 to n do begin

    for i:=(n+1) shr 1 downto 1 do

    for j:=sum shr 1 downto a[k] do

    f:=f or(f[i-1,j-a[k]]);

    end;

  • 0
    @ 2009-07-26 19:41:03

    program p1153;

    var a:array[1..1000000]of longint;

    t,n,i,j,sum1,sum2,sum3,x1,x2:longint;

    procedure work;

    begin

    for i:=1 to n div 2 do

    for j:=n div 2+1 to n do

    begin

    x1:=sum1-a[i]+a[j];

    x2:=sum2-a[j]+a[i];

    if (sum1

  • 0
    @ 2009-07-26 16:50:47

    {求救}

    谁有第二点的数据?

  • 0
    @ 2009-07-26 16:26:35

    var i,j,k,m,n,sum,ans:longint;

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

    f:array[0..201,0..8001]of boolean;

    begin

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

    readln(n);

    sum:=0;

    for i:=1 to n do begin readln(a[i]);sum:=sum+a[i];end;

    f[0,0]:=true;

    for i:=1 to n do

    for k:=n div 2 downto 1 do

    for j:=k*40 downto a[i]do

    f[k,j]:=f[k,j]or f[k-1,j-a[i]];

    for i:=sum div 2 downto 0 do

    if f[n div 2,i]then break;

    writeln(i);

    writeln(sum-i);

    end.

    {f表示 i 个人总的血能不能达到 j

    n div 2 是因为只需要 知道 n div 2个人就可以了 因为abs(i-j)

  • 0
    @ 2009-07-24 13:06:59

    谁能个秒杀的算法哇!!

    QQ 392106999

  • 0
    @ 2009-07-20 09:48:10

    program tug;

    var n,i,j,k,min,s,x:longint;

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

    c:array[0..101,0..8000]of boolean;

    begin

    readln(n);

    for i:=1 to n do

    begin

    readln(a[i]);

    s:=s+a[i];

    end;

    fillchar(c,sizeof(c),false);

    c[0,0]:=true;

    for i:=1 to n do

    begin

    x:=(i+1) div 2;

    for j:=x downto 0 do

    for k:=40*i downto 0 do

    if c[j,k] then c[j+1,k+a[i]]:=true;

    end;

    min:=maxlongint;

    for i:=0 to 40*x do

    if c[x,i] and (abs(s-i*2)

信息

ID
1153
难度
7
分类
动态规划 | 背包 点击显示
标签
递交数
4721
已通过
1027
通过率
22%
被复制
6
上传者