题解

191 条题解

  • 0
    @ 2013-05-15 18:10:36

    测试数据 #0: Accepted, time = 0 ms, mem = 772 KiB, score = 10
    测试数据 #1: Accepted, time = 0 ms, mem = 772 KiB, score = 10
    测试数据 #2: Accepted, time = 3 ms, mem = 772 KiB, score = 10
    测试数据 #3: Accepted, time = 0 ms, mem = 768 KiB, score = 10
    测试数据 #4: Accepted, time = 0 ms, mem = 772 KiB, score = 10
    测试数据 #5: Accepted, time = 0 ms, mem = 772 KiB, score = 10
    测试数据 #6: Accepted, time = 0 ms, mem = 768 KiB, score = 10
    测试数据 #7: Accepted, time = 0 ms, mem = 772 KiB, score = 10
    测试数据 #8: Accepted, time = 0 ms, mem = 768 KiB, score = 10
    测试数据 #9: Accepted, time = 0 ms, mem = 772 KiB, score = 10


    var
    cat:array[1..200]of longint;
    g1,g2:array[1..100]of longint;
    group1,group2,n,cat1,cat2,i,cha,x,y:longint;
    begin
    readln(n);
    for i:=1 to n div 2 do
    begin
    readln(cat[i]);
    group1:=group1+cat[i];
    g1[i]:=i;
    end;
    for i:=(n div 2)+1 to n do
    begin
    readln(cat[i]);
    group2:=group2+cat[i];
    g2[i-(n div 2)]:=i;
    end;
    cha:=abs(group1-group2);
    for cat1:=1 to n div 2 do
    for cat2:=n div 2+1 to n do
    begin
    if abs((group1-cat[g1[cat1]]+cat[g2[cat2-(n div 2)]])-(group2-cat[g2[cat2-(n div 2)]]+cat[g1[cat1]]))<cha then
    begin
    cha:=abs((group1-cat[g1[cat1]]+cat[g2[cat2-(n div 2)]])-(group2-cat[g2[cat2-(n div 2)]]+cat[g1[cat1]]));
    x:=group1-cat[g1[cat1]]+cat[g2[cat2-(n div 2)]];
    y:=group2-cat[g2[cat2-(n div 2)]]+cat[g1[cat1]];
    group1:=x; group2:=y;
    i:=g1[cat1];
    g1[cat1]:=g2[cat2-(n div 2)];
    g2[cat2-(n div 2)]:=i;
    end;
    end;
    if group1<group2 then writeln(group1,' ',group2) else writeln(group2,' ',group1);
    end.

  • 0
    @ 2012-10-13 15:29:02

    理解错题意害死人啊!大家一定要认真读题!我还以为可以不选某些士兵,结果想了半天写个四维动归,才发现,原来所有士兵都要选!那么就是很明显的背包啊!

    一定要认真读题啊!

    一定要认真读题啊!

    一定要认真读题啊!

    一定要认真读题啊!

    一定要认真读题啊!

    一定要认真读题啊!

  • 0
    @ 2012-08-12 16:04:43

    数据范围真实际 哈哈

  • 0
    @ 2012-07-30 13:38:37

    两部分的兵最多只能差一个。。。。。这好恶心啊。。

    这只是一个背包。。 稍微处理一下就可以了

  • 0
    @ 2010-04-13 00:44:37

    晕了半天没想出DP

    写了个随机调整 90分。。。。

  • 0
    @ 2009-11-09 10:50:41

    用7eleven的做法A得冷easy

  • 0
    @ 2009-11-06 20:51:26

    编译通过...

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

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

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

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

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

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

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

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

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

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

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

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

  • 0
    @ 2009-10-27 13:47:38

    因为血量只有1..40.不过40种

    因此最优解的数量非常多.随机化算法是可行的.

    编译通过...

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

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

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

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

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

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

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

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

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

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

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

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

  • 0
    @ 2009-10-26 19:42:50

    注意循环顺序和,n=奇数的情况。。。

    还有就是不要在VJ评测机上卡太严重的时候交题,否则TLE or 编译失败……

  • 0
    @ 2009-10-14 17:42:05

    数组开小了判的是超时,我的AC率...

    DP,背包的变种,注意要倒序

  • 0
    @ 2009-10-12 16:53:07

    编译通过...

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

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

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

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

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

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

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

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

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

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

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

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

    用DP

  • 0
    @ 2009-10-08 18:24:23

    lx的 因为你太贪了,所以比最优解优

  • 0
    @ 2009-10-08 11:22:14

    编译通过...

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

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

     ├ 错误行输出 40 4...

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

     ├ 错误行输出 361 36...

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

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

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

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

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

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

     ├ 错误行输出 122 1...

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

    var n,i,aa,bb:longint;

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

    procedure qsort(l,r:longint);

    var i,j,temp,mid:longint;

    begin

    i:=l;

    j:=r;

    mid:=a[(i+j) div 2];

    repeat

    while a[i]mid do dec(j);

    if (ij;

    if (il) then qsort(l,j);

    end;

    begin

    readln(n);

    for i:=1 to n do

    readln(a[i]);

    qsort(1,n);

    aa:=0;bb:=0;

    for i:=n downto 1 do

    if (aa>bb) then bb:=bb+a[i]

    else aa:=aa+a[i];

    if (aa>bb) then writeln(bb,' ',aa)

    else writeln(aa,' ',bb);

    end.

    小弟不会随机化,DP也不熟,就贪了一下......

    可是?

    输出是小的在前面,那看上面的数据,我的解貌似比标准输出更优?

    麻烦哪位为小弟解惑,小弟不胜感激...

  • 0
    @ 2009-10-06 14:57:21

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

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

     ├ 错误行输出

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

     ├ 错误行输出

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

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

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

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

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

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

     ├ 错误行输出

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

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

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

  • 0
    @ 2009-09-27 15:59:33

    f表示i的血量是否可以由j个兵来达到

    但是如果是普通的DP会TLE两个点

    程序中我用了一个tot2和index[]

    tot2表示现在最多达到的血量 index[i]表示i的血量最多多少人达到

    这样程序速度就秒出了

  • 0
    @ 2009-09-25 12:54:44

    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-09-18 18:44:37

    用记忆化搜索可以全0 MS.

    f表示用i个人,j的血能否到达。(boolean 或 枚举类型)

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

    当递归到f=true 时k就可以(break)终止循环了。

    但是要穷举递归f[n >> 1,i], 0 1,当f[n >> 1,i]=true 时输出并结束程序。

    PS:n >> 1 = n shr 1 = n div 2

  • 0
    @ 2009-09-12 09:05:40

    AC了7个数据,然后骗数据

  • 0
    @ 2009-09-03 20:52:06

    这种状态方程很难想哈。。

  • 0
    @ 2009-08-29 20:21:37

    编译通过...

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

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

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

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

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

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

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

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

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

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

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

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

    随机了10W次

信息

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