結果
問題 | No.134 走れ!サブロー君 |
ユーザー |
|
提出日時 | 2016-07-19 12:47:47 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 10 ms / 5,000 ms |
コード長 | 1,277 bytes |
コンパイル時間 | 1,506 ms |
コンパイル使用メモリ | 167,952 KB |
実行使用メモリ | 6,824 KB |
最終ジャッジ日時 | 2024-10-15 17:18:05 |
合計ジャッジ時間 | 2,431 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 15 |
ソースコード
#include <bits/stdc++.h>using namespace std;typedef long long ll;#define rep(i,n) for(int (i)=0;(i)<(int)(n);++(i))#define each(itr,c) for(__typeof(c.begin()) itr=c.begin(); itr!=c.end(); ++itr)#define all(x) (x).begin(),(x).end()#define mp make_pair#define pb push_back#define fi first#define se secondint n;int x[14],y[14];double w[14];//配送状況,最後に訪れた配送先(0はスタート地点)double dp[1<<14][14]={0};double dfs(int mask, int last){if(dp[mask][last]>=0) return dp[mask][last];//配送先から酒屋に帰るif(mask==(1<<(n+1))-2){return 5.0/6*(abs(x[last]-x[0])+abs(y[last]-y[0]));}//現在の荷物の重さdouble W=0;for(int i=1; i<=n; ++i) if(!(mask>>i&1)) W+=w[i];//かかる時間double T=(W+100)/120;double ret=1e10;//次の配送先for(int i=1; i<=n; ++i){if(mask>>i&1) continue;ret=min(ret,dfs(mask+(1<<i),i)+w[i]+T*(abs(x[i]-x[last])+abs(y[i]-y[last])));}return dp[mask][last]=ret;}int main(){int x0,y0;cin >>x0 >>y0;cin >>n;x[0]=x0;y[0]=y0;for(int i=1; i<=n; ++i) cin >>x[i] >>y[i] >>w[i];fill(dp[0],dp[1<<14],-1);printf("%.10lf\n", dfs(0,0));return 0;}