博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) - D
阅读量:5967 次
发布时间:2019-06-19

本文共 1203 字,大约阅读时间需要 4 分钟。

 

题目链接:http://codeforces.com/contest/831/problem/D

题意:在一个一维坐标里,有n个人,k把钥匙(钥匙出现的位置不会重复并且对应位置只有一把钥匙),和一个终点p。问你每个人都拿到一把钥匙并且回到终点的情况下,n个人之中所花时间最长的那个人时间最少是多少?(一秒只能走一个单位的距离)

思路:考虑二分x,x为每个人能走的步数。对于两个人a,b和两把钥匙c,d 那么当p[a]<p[b]并且p[c]<p[d]时, a拿c钥匙,b拿d钥匙是最优的,因为对于p[c]到终点p的距离和p[d]到终点p的距离是固定的,但是如果a拿d, b拿c的话则出现交叉距离会更大,所花时间更大(贪心); 所以我们对于人和钥匙排个序,然后对于每个人都去拿在步数小于x的情况下(x包括从起点到拿钥匙,在从钥匙位置到终点的距离),最左边的那把钥匙。 然后预处理一下每个人拿每一个钥匙并且回到终点的时间即可。

import java.io.*;import java.util.*;public class Main {    public static final int MAXN=1000+24;    public static final int MAXK=2000+24;    public static final int INF=((int)2e9)+24;    public static int n,k,p;    public static int[] pos=new int[MAXN];    public static int[] keys=new int[MAXK];    public static boolean[] vis=new boolean[MAXK];    public static int[][] dist=new int[MAXN][MAXK];        public static boolean check(int x){        Arrays.fill(vis, false);        for(int i=0;i
=l){ mid=l + ((r - l) >> 1); if(check(mid)){ r=mid-1; }else{ l=mid+1; } } out.println(l); out.flush(); out.close(); cin.close(); }}

 

转载于:https://www.cnblogs.com/kirito520/p/7247013.html

你可能感兴趣的文章
C++ little errors , Big problem
查看>>
在 ML2 中配置 OVS vlan network - 每天5分钟玩转 OpenStack(136)
查看>>
Selenium2+python自动化34-获取百度输入联想词
查看>>
【★★★★★】提高PHP代码质量的36个技巧
查看>>
如何解决/home/oracle: is a directory报警
查看>>
python基础学习笔记(九)
查看>>
BaaS API 设计规范
查看>>
bootloader功能介绍/时钟初始化设置/串口工作原理/内存工作原理/NandFlash工作原理...
查看>>
iOS开发UI篇—Quartz2D使用(矩阵操作)
查看>>
C++ 构造函数与析构函数
查看>>
定时压缩log日志文件
查看>>
Tomcat的结构概述
查看>>
轻松八句话 教会你完全搞定MySQL数据库(基础)
查看>>
UIImagePickerController选择图片发送后旋转90度的问题
查看>>
常用excel函数 vlookup,concatenate,& 的使用
查看>>
MySql多表
查看>>
数据创建表 修改列 新增列
查看>>
PHP 服务器变量 $_SERVER(转)
查看>>
Linux基础 -- vim编辑器3 -- 查找和替换
查看>>
openssh-server (>= 1:6.6p1-2ubuntu1) but it is not going to be installed
查看>>