結果

問題 No.134 走れ!サブロー君
ユーザー Yuki InoueYuki Inoue
提出日時 2023-12-24 01:25:17
言語 C++23
(gcc 12.3.0 + boost 1.83.0)
結果
WA  
実行時間 -
コード長 1,502 bytes
コンパイル時間 3,059 ms
コンパイル使用メモリ 247,728 KB
実行使用メモリ 6,948 KB
最終ジャッジ日時 2024-09-27 13:32:03
合計ジャッジ時間 3,923 ms
ジャッジサーバーID
(参考情報)
judge2 / judge1
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
6,816 KB
testcase_01 AC 2 ms
6,940 KB
testcase_02 AC 2 ms
6,940 KB
testcase_03 WA -
testcase_04 WA -
testcase_05 WA -
testcase_06 WA -
testcase_07 WA -
testcase_08 WA -
testcase_09 WA -
testcase_10 WA -
testcase_11 WA -
testcase_12 WA -
testcase_13 WA -
testcase_14 WA -
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<b;i++)
#define rrep(i,a,b) for(int i=a;i>=b;i--)
#define fore(i,a) for(auto &i:a)
#define all(x) (x).begin(),(x).end()
using namespace std;
typedef long long ll;
typedef pair<int, int> P;
int INF = 1e5;
ll MOD = 1e3;

int N, X, Y, x, y;
double w, o;

double distance(P p1, P p2){
    return abs(p1.first - p2.first) + abs(p1.second - p2.second);
}

double tot_time(double distance, double tot_w, double w){
    return distance*(tot_w+100)/120 + w;
}

int main(){
    cin >> X >> Y;
    P start = make_pair(X,Y);

    cin >> N;

    double W[N];
    P d_points[N];
    rep(i,0,N){
        cin >> x >> y >> w;
        d_points[i] = make_pair(x,y);
        W[i] = w;
    }

    double tot_w[1<<N];
    tot_w[(1<<N)-1] = 0;
    rrep(i,(1<<N)-2,0) rep(j,0,N) if((i & (1<<j))==0){
        tot_w[i] = tot_w[i+(1<<j)] + W[j];
        break;
    }

    double dp[1<<N][N];
    rep(i,0,1<<N) rep(j,0,N) dp[i][j] = INF;
    rep(i,0,N) dp[1<<i][i] = tot_time(distance(start, d_points[i]), tot_w[0], W[i]);

    rep(i,1,1<<N) rep(j,0,N) rep(k,0,N){
        if((i & (1<<k))==0 && (i & (1<<j))){
            o = dp[i][j] + tot_time(distance(d_points[j], d_points[k]), tot_w[i], W[k]);
            if(i + (1<<k) == (1<<N) - 1) dp[i+(1<<k)][k] = min(o + tot_time(distance(d_points[k], start), 0, 0), dp[i+(1<<k)][k]);
            else dp[i+(1<<k)][k] = min(o, dp[i+(1<<k)][k]); 
        }
    }

    cout << *min_element(dp[(1<<N)-1], dp[(1<<N)-1]+N) << endl;
}
0