Checker modified.
查看原帖
Checker modified.
60864
tiger2005楼主2021/11/16 12:18

之前的 checker 的 dp 部分有一处写错了,过来更改了一下。

#include "testlib.h"
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <map>
#include <vector>
using namespace std;
int dp[110][110];
int cst[110][110];
int N;
int rans,lans;
int main(int argc, char ** argv){
    registerTestlibCmd(argc, argv);
    N = ouf.readInt(1, 100);
    for(int i=1; i<=N; i++)
        for(int j=i+1; j<=N; j++)
            cst[i][j] = ouf.readInt(1, 100);
    //Right Answer
    memset(dp, 0x3f, sizeof(dp)); dp[1][1] = 0;
    for(int i=2; i<=N; i++)
        for(int j=1; j<i; j++){
            //dp[i-1][j] -> dp[i][j]
            dp[i][j] = min(dp[i][j], dp[i-1][j] + cst[i-1][i]);
            //dp[i-1][j] -> dp[i][i-1]
            dp[i][i-1] = min(dp[i][i-1], dp[i-1][j] + cst[j][i]);
        }
    rans = dp[0][0];
    for(int i=1; i<=N; i++)
        rans = min(rans, dp[N][i]);
    //Fake answer
    int x = 1, y = 1, sx = 0, sy = 0;
    for(int i=2; i<=N; i++){
        if(sx + cst[x][i] < sy + cst[y][i]){
            sx += cst[x][i];
            x = i;
        } else{
            sy += cst[y][i];
            y = i;
        }
    }
    lans = sx + sy;
    int sco = min(100, (int)ceil(1.0 * lans / rans / 4) * 4);
    if(sco == 100)
        quitf(_ok, "Answer Correct! rans = %d, lans = %d", rans, lans);
    else
        quitp(1.0 * sco / 100, "Answer Partially Correct! rans = %d, lans = %d", rans, lans);
    return 0;
}

其中

dp[i][i-1] = min(dp[i][i-1], dp[i-1][j] + cst[j][i]);

之前被写成了:

dp[i][i-1] = min(dp[i][j], dp[i-1][j] + cst[j][i]);

2021/11/16 12:18
加载中...