結果
問題 | No.134 走れ!サブロー君 |
ユーザー | takenkotake |
提出日時 | 2024-06-30 12:04:41 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 59 ms / 5,000 ms |
コード長 | 1,408 bytes |
コンパイル時間 | 2,157 ms |
コンパイル使用メモリ | 202,352 KB |
実行使用メモリ | 169,548 KB |
最終ジャッジ日時 | 2024-06-30 12:04:46 |
合計ジャッジ時間 | 4,072 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 41 ms
168,272 KB |
testcase_01 | AC | 43 ms
168,400 KB |
testcase_02 | AC | 42 ms
169,548 KB |
testcase_03 | AC | 45 ms
167,632 KB |
testcase_04 | AC | 44 ms
167,632 KB |
testcase_05 | AC | 47 ms
168,412 KB |
testcase_06 | AC | 47 ms
167,664 KB |
testcase_07 | AC | 52 ms
168,716 KB |
testcase_08 | AC | 59 ms
168,652 KB |
testcase_09 | AC | 58 ms
168,784 KB |
testcase_10 | AC | 40 ms
167,756 KB |
testcase_11 | AC | 43 ms
168,264 KB |
testcase_12 | AC | 42 ms
168,140 KB |
testcase_13 | AC | 41 ms
167,504 KB |
testcase_14 | AC | 42 ms
168,528 KB |
ソースコード
#include<bits/stdc++.h> using namespace std; const long inf = 1e9; int X[21],Y[21]; double W[21]; int dist[20][20]; double dp[(1 << 20)][20]; double weight[(1 << 20)]; int main(void){ cin >> X[0] >> Y[0]; long long n; cin >> n; for(int i=1;i<=n;i++){ cin >> X[i] >> Y[i] >> W[i]; } for(int i=0;i<=n;i++){ for(int j=0;j<=n;j++){ dist[i][j]=abs(X[i]-X[j])+abs(Y[i]-Y[j]); } } for(int msk=0; msk<(1<<(n+1)); msk++){ double tmp=0; for(int i=0;i<=n;i++){ if(!(msk&(1<<i))){//まだ積んでる荷物 tmp+=W[i]; } } weight[msk]=tmp; } for(int i=0;i<(1<<20);i++){ for(int j=0;j<=n;j++){ dp[i][j]=inf; } } dp[0][0]=0.0; // 1は選択済み。0はこれから for(int msk=0; msk<(1<<(n+1)); msk++){ for(int i=0;i<=n;i++){//now for(int j=0; j<=n; j++){//next if(!(msk & (1<<j))){//未訪問 double cost = dist[i][j] * (double)((weight[msk]+100.0)/120.0);//移動コスト dp[msk+(1<<j)][j]= min(dp[msk+(1<<j)][j],dp[msk][i]+cost);//体力多い条件を残す } } } } double ans = 0; for(int i=0;i<=n;i++){//荷下ろしの時間 ans += W[i]; } ans += dp[(1<<(n+1))-1][0]; printf("%.9f\n",ans); return 0; }