免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2012 | 回复: 3
打印 上一主题 下一主题

[算法] 看我错了哪里?PKU 1015 ~~ Wrong Answer.. [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-27 15:01 |只看该作者 |倒序浏览
pku 1015 Jury Compromise
http://acm.pku.edu.cn/JudgeOnline/problem?id=1015

下面是我的代码,我是用动态规划做的,我自己测试的答案也是对的,但是它老说我Wrong Answer!到底是哪里错了?

#include <stdio.h>
#include <limits.h>

#define N 202
#define M 22

int d[N + 1], p[N + 1];
int f[N + 1][M + 1];
int S[N + 1][M + 1];
int l[N + 1][M + 1];
int n, m;
int times = 0;

void dp() {
    int i, j, x1, x2, y1, y2;

    for(i = 0; i <= n; i++) {
        f[i][0] = 0;
        S[i][0] = 0;
    }
    for(j = 1; j <= m; j++)
        for(i = 0; i < j; i++)
            f[i][j] = INT_MAX;

    for(i = 1; i <= n; i++)
        for(j = 1; j <= i && j <= m; j++) {
            x1 = f[i - 1][j];
            x2 = f[i - 1][j - 1] + (d[i] - p[i]);
            y1 = x1 > 0 ? x1 : (-1) * x1;
            y2 = x2 > 0 ? x2 : (-1) * x2;
            if(y1 < y2) {
                f[i][j] = x1;
                S[i][j] = S[i - 1][j];
                l[i][j] = 0;
            }
            else if(y1 > y2) {
                f[i][j] = x2;
                S[i][j] = S[i - 1][j - 1] + d[i] + p[i];
                l[i][j] = 1;
            }
            else if(S[i - 1][j] >= S[i - 1][j - 1] + d[i] + p[i]) {
                f[i][j] = x1;
                S[i][j] = S[i - 1][j];
                l[i][j] = 0;
            }
            else {
                f[i][j] = x2;
                S[i][j] = S[i - 1][j - 1] + d[i] + p[i];
                l[i][j] = 1;
            }
        }
}

int init() {
    int i;
   
    scanf("%d%d", &n, &m);
    if(n == 0 && m == 0)
        return 0;
    times++;
    for(i = 1; i <= n; i++) {
        scanf("%d%d", &p[i], &d[i]);
    }
    return 1;
}
int show_arr[N + 1];
int *show_p;
void show() {
    int i, j, t, A, B, *cp;

    printf("Jury #%d\n", times);
   
    show_p = show_arr;
    i = n;
    j = m;
    t = l[n][m];
    while(j > 0) {
        if(t) {
            *show_p++ = i;
            j--;
        }
        i--;
        t = l[i][j];
    }

    A = B = 0;
    for(cp = show_p - 1; cp >= show_arr; cp--) {
        A += d[*cp];
        B += p[*cp];
    }
    printf("Best jury has value %d for prosecution and value %d for defence:\n"
           , B, A);
    while(show_p > show_arr) {
        printf(" %d", *--show_p);        
    }
    printf("\n");
}


int main() {

    while(init()){
        dp();
        show();
    }
   
    return 0;
}

论坛徽章:
0
2 [报告]
发表于 2009-07-27 15:47 |只看该作者
找极端情况。。。

论坛徽章:
0
3 [报告]
发表于 2009-07-28 09:40 |只看该作者
原帖由 cugb_cat 于 2009-7-27 15:47 发表
找极端情况。。。

我找了呀。。。怎么知道找完没啊。。。

论坛徽章:
0
4 [报告]
发表于 2009-07-28 09:43 |只看该作者
原帖由 pz0513 于 2009-7-28 09:40 发表

我找了呀。。。怎么知道找完没啊。。。

向管理员要测试数据。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP