原题链接:http://codeforces.com/contest/830/problem/A

题意:在一条数轴上分别有n个人和k把钥匙(n<=k),以及一个目的地,每个人要各自拿到一个钥匙后到达目的地。每个人的移动速度都是1, 问所有人都到达目的地的最短时间。

思路:转化一下题意,就是求耗时最长的人所用的最短时间。

我们可以二分答案x,然后对排序后的人以及钥匙进行枚举,进行从左至右搭配。 这里check函数中返回false的条件是从左至右所有人都能在x的时间内到达目的地,而计算这些人到达目的地的时间是:取最近的一对人与钥匙计算,为了每个人耗时最少(贪心),这是最优的。

AC代码:

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
const int MAXN=;
int n,k;
int a[MAXN],b[MAXN],S;
bool check(LL x){
int p=;
for(int i=;i<=n;i++){
while(p<=k){
p++;
if(1LL*(abs(a[i]-b[p])+abs(b[p]-S))<=x) break;
}
if(p>k) return false;
}
return true;
}
int main()
{
scanf("%d %d %d", &n , &k, &S);
for(int i=;i<=n;i++) scanf("%d", &a[i]);
for(int i=;i<=k;i++) scanf("%d", &b[i]);
sort(a+, a+n+);
sort(b+, b+k+);
LL l=,r=2e9+;
LL mid;
while(l<r){
mid=(l+r)/;
if(check(1LL*mid)) r=mid;
else l=mid+;
}
printf("%d\n", l);
}

这道题也可以用dp来做: dp[i][j]表示前i个人有前j个钥匙的最优解,利用01背包思想可以在O(n*k)时间内求出答案。

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
const int INF=2e9+;
const int MAXN=;
int n,k;
int a[MAXN],b[MAXN],S;
int dp[MAXN][MAXN];
int main(){
scanf("%d %d %d", &n , &k, &S);
for(int i=;i<=n;i++) scanf("%d", &a[i]);
for(int i=;i<=k;i++) scanf("%d", &b[i]);
sort(a+,a++n);
sort(b+,b++k);
for(int i=; i<=n; i++)
for(int j=; j<=k; j++)
dp[i][j] = INF;
for(int i=; i<=k; i++) dp[][i]=;
for(int i=; i<=n; i++)
for(int j=i; j<=k; j++){
dp[i][j] = min(dp[i][j-],max(dp[i-][j-],abs(a[i]-b[j])+abs(b[j]-S)));
}
printf("%d\n", dp[n][k]);
return ;
}

Codeforces 830A. Office Keys (贪心二分 or DP)的更多相关文章

  1. CF830A Office Keys(贪心)

    CF830A Office Keys [题目链接]CF830A Office Keys [题目类型]贪心 &题意: 有n个人,k个钥匙,一个目的地,求让n个人都回到目的地的最短时间,每个人都要 ...

  2. bzoj 2067: [Poi2004]SZN【贪心+二分+树形dp】

    第一问就是Σ(deg[u]-1)/2+1 第二问是二分,判断的时候考虑第一问的贪心规则,对于奇度数的点,两两配对之后一条延伸到上面:对于欧度数的点,两两配对或者deg[u]-2的点配对,然后一条断在这 ...

  3. Codeforces 865C Gotta Go Fast 二分 + 期望dp (看题解)

    第一次看到这种骚东西, 期望还能二分的啊??? 因为存在重置的操作, 所以我们再dp的过程中有环存在. 为了消除环的影响, 我们二分dp[ 0 ][ 0 ]的值, 与通过dp得出的dp[ 0 ][ 0 ...

  4. Codeforces 825D Suitable Replacement - 贪心 - 二分答案

    You are given two strings s and t consisting of small Latin letters, string s can also contain '?' c ...

  5. AC日记——830A - Office Keys

    思路: 背包: 代码: #include <cmath> #include <cstdio> #include <cstring> #include <ios ...

  6. BZOJ 1046: [HAOI2007]上升序列【贪心+二分状态+dp+递归】

    1046: [HAOI2007]上升序列 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4987  Solved: 1732[Submit][Stat ...

  7. Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) D. Office Keys time limit per test2 seconds 二分

    D. Office Keys time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...

  8. Codeforces Round #768 (Div. 2) D. Range and Partition // 思维 + 贪心 + 二分查找

    The link to problem:Problem - D - Codeforces   D. Range and Partition  time limit per test: 2 second ...

  9. Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) Office Keys(思维)

    Office Keys time limit per test 2 seconds memory limit per test 256 megabytes input standard input o ...

随机推荐

  1. tcp中的常见定时器

    (1)超时重传定时器tcp的靠谱特性,通过确认机制,保证每一个包都被对方收到,那么什么时候需要重传呢?就是靠这个超时重传定时器,每次发送报文前都启动这个定时器,如果定时器超时之前收到了应答则关闭定时器 ...

  2. mkdir: 无法创建目录"kk": 只读文件系统

    创建文件提示 root@hap1:/test>mkdir kk mkdir: 无法创建目录"kk": 只读文件系统 root@hap1:/test>mount .... ...

  3. 16/7/8_PHP-正则表达式

    什么叫正则表达式 PCRE库函数中,正则匹配模式使用分隔符与元字符组成,分隔符可以是非数字.非反斜线.非空格的任意字符.经常使用的分隔符是正斜线(/).hash符号(#) 以及取反符号(~),例如: ...

  4. Vue Router 路由守卫:完整的导航解析流程

    完整的导航解析流程 1 导航被触发. 2 在失活的组件里调用离开守卫. 3 调用全局的 beforeEach 守卫. 4 在重用的组件里调用 beforeRouteUpdate 守卫 (2.2+). ...

  5. LeetCode 94. Binary Tree Inorder Traversal 动态演示

    非递归的中序遍历,要用到一个stack class Solution { public: vector<int> inorderTraversal(TreeNode* root) { ve ...

  6. SpringBoot中FreeMarker创建

    1.创建SpringBoot项目时,勾选freemarker依赖(web,dev) 2.Controller中向model中存放数据 package com.ziv.springbootbygrald ...

  7. linux系统系统调优之----内核优化

    主要是指在Linux系统中针对服务应用而进行的系统内核参数调整,优化没有的标准, 根据实际需求优化才是最合适的. 1)编辑内核配置文件 2)参数及简单说明 3)生效配置 1)编辑内核配置文件 vim ...

  8. win10创建扩展分区

    1.开始菜单中选择命令提示符,以管理员身份运行. 2.运行“diskpart”命令. 3.DISKPART>后面输入list disk命令,显示磁盘列表. 4.选择磁盘,select disk ...

  9. VSCode工具插件推荐

    一:VSCode简介 VSCode( Visual Studio Code)是微软出的一款轻量级代码编辑器 ,重要的是它在Windows, OS X 和Linux操作系统的桌面上均可运行.Visual ...

  10. Java8 特性详解(一) Lambda

    为什么要使用lambda表达式 从函数式接口说起 理解Functional Interface(函数式接口)是学习Java8 lambda表达式的关键所在. 函数式接口的定义其实很简单:任何接口,如果 ...