题目链接: 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)相关推荐

  1. dp,sp,px相互转化

    方法一: public int sp2px(float sp) {return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, ...

  2. [JS][dp]题解 | #打家劫舍(一)#

    题解 | #打家劫舍(一)# 题目链接 打家劫舍(一) 题目描述 描述 你是一个经验丰富的小偷,准备偷沿街的一排房间,每个房间都存有一定的现金,为了防止被发现,你不能偷相邻的两家,即,如果偷了第一家, ...

  3. HDU 2084 数塔(DP)(JAVA版)

    数塔 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...

  4. dp cf 20190615

    A. Timofey and a tree 这个不算是dp,就是一个思维题,好难想的思维题,看了题解才写出来的, 把点和边分开,如果一条边的两个点颜色不同就是特殊边,特殊边两边连的点就叫特殊点, 如果 ...

  5. BZOJ 1003[ZJOI2006]物流运输(SPFA+DP)

    Problem 1003. -- [ZJOI2006]物流运输 1003: [ZJOI2006]物流运输 Time Limit: 10 Sec  Memory Limit: 162 MB Submit ...

  6. [NOI2005]聪聪与可可(期望dp)

    题意:给一张无向图,有一只猫和一只老鼠,猫每秒会向老鼠的方向移动两个单位,若它们的距离为一,那么只会移动一个单位,老鼠会等概率向周围移动一步或不动,求猫抓到老鼠的期望时间. Solution luog ...

  7. Codeforces 903F Clear The Matrix(状态压缩DP)

    题目链接 Clear The Matrix 题意 给定一个$4 * n$的矩形,里面的元素为$'.'$或$'*'$.现在有$4$种正方形可以覆盖掉$'*'$,正方形的边长分别为$1,2,3,4$. 求 ...

  8. 喵哈哈村的魔法考试 Round #1 (Div.2) 题解源码(A.水+暴力,B.dp+栈)

    A.喵哈哈村的魔法石 发布时间: 2017年2月21日 20:05   最后更新: 2017年2月21日 20:06   时间限制: 1000ms   内存限制: 128M 描述 传说喵哈哈村有三种神 ...

  9. 尼克的任务 dp 洛谷1280

    蒟蒻表示老久没看过dp题目了,,挺水的一道dp题目都没想出来,,, 首先设dp[i]表示从开始到i时间的最大空闲时间,用vector to[x] 表示从x点开始的任务结束时间,cnt[x]表示从x开始 ...

最新文章

  1. P1066 2^k进制数 NOIP 2006 提高组 第四题
  2. ps背景不变换字_分享五个超级实用的PS小技巧
  3. android 图片绑定按钮,Android编程实现给Button添加图片和文字的方法
  4. fatal error: hdf5.h: No such file or directory
  5. css线加点的进度,纯CSS实现的交互式进度条(点击带进度填充动画)
  6. jmeter生成html报告修改,Jmeter生成html报告(示例代码)
  7. 多文件管理器 tablacus explorer 下载与安装
  8. Python中lambda的使用,与它的三个好基友介绍!
  9. Spring+SpringMVC+MyBatis深入学习及搭建(二)——MyBatis原始Dao开发和mapper代理开发(转发同上)...
  10. list 集合 分页 三种实现方式,include jdk8 --stream
  11. laravel插入数据时报 502 Bad Gateway
  12. Echarts多条折线图 y轴数值与实际值不符解决方法
  13. servlet的配置(映射)以及生命周期
  14. C4D快速入门教程——创建模型
  15. c语言spoc测验成绩比重,SPOC混合教学模式在C语言程序设计课程的应用
  16. .NET Standard中配置TargetFrameworks输出多版本类库
  17. Codeforces869 E. The Untended Antiquity (随机化算法)
  18. 算法分析----基础知识点
  19. Diagnosing OSGi uses conflicts
  20. Linux下C++使用Protobuf的安装步骤(vscode)

热门文章

  1. python is 和 == 的区别、解码和编码 小数据池
  2. 寻找重复的子树 Find Duplicate Subtrees
  3. 将表单中查询参数转换为json
  4. *2-3-7-加入field_automation机制
  5. SecureCRT中使用 rz 上传文件 遇到 rz: command not found 的解决办法
  6. 使用CSS3线性渐变实现图片闪光划过效果
  7. [git]git忽略文件
  8. 利用CSS变量实现炫酷的悬浮效果
  9. ubuntu 创建桌面快捷方式
  10. 云安全:云访问安全代理(CASB)系统的陷阱和潜力