結果
| 問題 |
No.134 走れ!サブロー君
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-12-24 01:25:17 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.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 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 3 WA * 12 |
ソースコード
#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;
}