結果
| 問題 |
No.134 走れ!サブロー君
|
| コンテスト | |
| ユーザー |
takenkotake
|
| 提出日時 | 2024-06-30 12:04:41 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 59 ms / 5,000 ms |
| コード長 | 1,408 bytes |
| コンパイル時間 | 2,107 ms |
| コンパイル使用メモリ | 194,208 KB |
| 最終ジャッジ日時 | 2025-02-22 01:37:00 |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 15 |
ソースコード
#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;
}
takenkotake