日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

cf831D(dp)

發布時間:2024/4/15 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 cf831D(dp) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接: http://codeforces.com/contest/831/problem/D

?

題意: 有 n 個人和 k 把鑰匙, 數組 a 為 n 個人的初始位置, 數組 b 為 k 把鑰匙的初始位置, n 個人都要先拿到一把鑰匙然后在到 p 位置去, 問所有人都到 p 位置所需要的最少時間是多少.

?

思路: 這題即可以 dp 也可以直接二分答案.

dp 思路為: dp[i][j]存儲前i個人在前j把鑰匙中每個人得到鑰匙的最小花費.

那么動態轉移方程式為:

  if(i == j) dp[i][j] = max(dp[i - 1][j - 1], abs(a[i] - b[j]) + abs(p - b[j]))

  else if(j > i) dp[i][j] = min(dp[i][j - 1], max(dp[i - 1][j - 1], abs(a[i] - b[j]) + abs(p - b[j])))

?

代碼:

1 #include <iostream> 2 #include <algorithm> 3 #include <stdio.h> 4 using namespace std; 5 6 const int MAXN = 1e3 + 10; 7 int a[MAXN], b[MAXN << 1], dp[MAXN][MAXN << 1];//dp[i][j]存儲前i個人在前j把鑰匙中每個人得到鑰匙的最小花費 8 9 int main(void){ 10 int n, k, p; 11 scanf("%d%d%d", &n, &k, &p); 12 for(int i = 1; i <= n; i++){ 13 scanf("%d", &a[i]); 14 } 15 for(int i = 1; i <= k; i++){ 16 scanf("%d", &b[i]); 17 } 18 sort(a + 1, a + n + 1); 19 sort(b + 1, b + k + 1); 20 for(int i = 1; i <= n; i++){ 21 for(int j = i; j <= k; j++){ 22 if(i == j) dp[i][j] = max(dp[i - 1][j - 1], abs(b[j] - a[i]) + abs(p - b[j])); 23 else dp[i][j] = min(dp[i][j - 1], max(dp[i - 1][j - 1], abs(b[j] - a[i]) + abs(p - b[j]))); 24 } 25 } 26 int sol = 2e9 + 10; 27 for(int i = n; i <= k; i++){ 28 sol = min(sol, dp[n][i]); 29 } 30 printf("%d\n", sol); 31 return 0; 32 } View Code

?

轉載于:https://www.cnblogs.com/geloutingyu/p/7181935.html

總結

以上是生活随笔為你收集整理的cf831D(dp)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。