結果
問題 | No.134 走れ!サブロー君 |
ユーザー |
![]() |
提出日時 | 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++){//nowfor(int j=0; j<=n; j++){//nextif(!(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;}