結果
問題 | No.2955 Pizza Delivery Plan |
ユーザー | vwxyz |
提出日時 | 2024-11-08 21:29:11 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 295 ms / 2,000 ms |
コード長 | 1,078 bytes |
コンパイル時間 | 190 ms |
コンパイル使用メモリ | 82,816 KB |
実行使用メモリ | 80,000 KB |
最終ジャッジ日時 | 2024-11-08 21:29:18 |
合計ジャッジ時間 | 7,535 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 28 |
ソースコード
N,K=map(int,input().split()) X,Y=[],[] for i in range(N): x,y=map(int,input().split()) X.append(x) Y.append(y) def dist(i,j): if j==-1: i,j=j,i if i==-1: return (X[j]**2+Y[j]**2)**.5 return ((X[i]-X[j])**2+(Y[i]-Y[j])**2)**.5 inf=1e20 dp=[[inf]*N for bit in range(1<<N)] for bit in range(1<<N): for n in range(N): if bit&1<<n: if bit==1<<n: dp[bit][n]=min(dp[bit][n],dist(-1,n)) else: for m in range(N): if n==m: continue if not bit&1<<m: continue dp[bit][n]=min(dp[bit][n],dp[bit^1<<n][m]+dist(n,m)) DP=[inf]*(1<<N) for bit in range(1<<N): for n in range(N): DP[bit]=min(DP[bit],dp[bit][n]+dist(n,-1)) DP[0]=0 dp=DP DP=[inf]*(1<<N) DP[0]=0 for bit in range(1<<N): subset=bit while subset: if subset.bit_count()<=K: DP[bit]=min(DP[bit],DP[subset^bit]+dp[subset]) subset-=1 subset&=bit ans=DP[-1] print(ans)