CodeForces 343C Read Time 【二分答案】+【贪心】

<题目链接>

题目大意:

一条水平的磁道上有n个磁头和m个待扫描的点,磁头可以左右互不干扰的移动去扫描点,每秒移动一个单位(也可以停留在原地),求这些磁头扫描完这些所有的点最少需要要花多少时间。

解题分析:

本题用二分答案和贪心求解,先二分出这些磁头扫描完所有的点所需的时间,然后用贪心策略去模拟每个磁头扫描这些点。对这些磁头从左向右分析,假设二分出的总时间为mid,在该条件下,每个磁头扫描点的最优情况毫无疑问是,在保证扫描到当前 最左边未被扫描到的点的情况下,向右扫描尽可能远的距离(对于这些磁头从左向右分析时)。但是同时,有几种情况要讨论:1.如果最左边的为扫描过的点在该磁头的右侧,那么该磁头在mid时间内全部向右移动即可;2.如果最左边的点在当前磁头的左侧,如果到达不了最左边未走过的点,那么说明mid枚举过小,重新枚举。如果能够到达这个最左边的未被扫描过的点,也要分两种情况:一是,磁头先向左走,在能够到达最左边未走过的点的情况下,记录它向右到达的最远距离。二是,该磁头开始先向右走,在当前枚举的mid范围下,在保证经过最左边的那个点的情况下,尽量向右走的更远。至于为什么磁头开始走的方向也要分情况讨论,可以参照一下样例三。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

typedef long long ll;
const int M =1e5+5;
int n,m,vis[M];
ll h[M],p[M];

int main(){
    while(scanf("%d%d",&n,&m)!=EOF){
        for(int i=1;i<=n;i++)scanf("%lld",&h[i]);
        for(int i=1;i<=m;i++)scanf("%lld",&p[i]);
        ll maxn;
        if(h[1]<p[1])maxn=p[m]-h[1];
        else{
            maxn=h[1]-p[1];
            if(h[1]<p[m]){
                maxn=min(2*maxn+p[m]-h[1],maxn+2*(p[m]-h[1]));
                //第一个探头先向左走和向右走,走完所有触点的总时间,从这两个总时间中取最小的作为二分答案的上界;注意,取最小的作为上界,因为如果只有一个探头,那么算出来的结果直接就是答案,如果有多个探头,第一个探头走完所有触点的最短时间也足以作为上界
            }
        }
        ll l=0,r=maxn;
        while(l<r){
            memset(vis,0,sizeof(vis));  //标记每个触点是否走过
            ll mid=(l+r)>>1;     //二分答案,mid为这些探头经过所有的触点所需的时间
            ll dist=0;int loc,k;
            for(int i=loc=1;i<=n;i++){
                if(p[loc]>=h[i])     //最左边的没有走过的触点
                    dist=mid+h[i];
                else{
                    if(h[i]-p[loc]>mid)break;
                    dist=max(h[i]+mid-2*(h[i]-p[loc]),h[i]+(mid-(h[i]-p[loc]))/2);  //在枚举的答案下,即总共花费的时间下,该探头在能够在 走过最左边没有走过的触点的情况下,尽可能的向右走的更远
                }
                for(k=loc;p[k]<=dist&&k<=m;k++)vis[k]=1;     //将新走过的触点标记
                if(vis[m])break;    //如果最后一个触点都被标记了,就跳出
                else loc=k;
            }
            if(vis[m])r=mid;
            else l=mid+1;
        }
        printf("%lld\n",l);
    }
    return 0;
}

2018-09-20

原文地址:https://www.cnblogs.com/00isok/p/9681668.html

时间: 2024-11-08 23:52:58

CodeForces 343C Read Time 【二分答案】+【贪心】的相关文章

codeforces 343C Read Time 二分 + 贪心

http://codeforces.com/problemset/problem/343/C 题意: 有一些磁头,给出了起始的位置,给出了一些磁盘中需要访问的地点.求这些磁头移动的最小的次数. 思路: 二分找出满足要求的最小的时间,对于当前尝试的时间进行贪心判断是否可用.对于贪心,因为每一个磁头都需要读到还没有人读过的最左边的地方.如果这个都不能满足,那么这个时间是不可以的. 在这基础上,对于同样的这么多时间,尽可能的让这个磁头读到能读到的最右边,这样就可以将还没有读过的地方尽可能的往右推. 如

Educational Codeforces Round 3:D. Gadgets for dollars and pounds(二分答案+贪心)

看了菊苣的理解才知道怎么写..根本没思路啊一开始... 天数肯定在1~n之间,二分答案. 可以用保存前i天的最低美元和英镑汇率,没有规定哪天买,每天也没有购买数量限制,所以二分出一个答案mid的后,就在前mid天中汇率最低的时候一次性购入最便宜的就行了,judge一下总花费 打印答案的时候以ans为结果,再模拟一遍就好 #include"cstdio" #include"queue" #include"cmath" #include"s

Codeforces 772A Voltage Keepsake - 二分答案

You have n devices that you want to use simultaneously. The i-th device uses ai units of power per second. This usage is continuous. That is, in λ seconds, the device will use λ·ai units of power. The i-th device currently has bi units of power store

Gym 100886J Sockets 二分答案 + 贪心

Description standard input/outputStatements Valera has only one electrical socket in his flat. He also has m devices which require electricity to work. He's got n plug multipliers to plug the devices, the i-th plug multiplier has ai sockets. A device

Codeforces Round #425 (Div. 2) Problem C (Codeforces 832C) Strange Radiation - 二分答案 - 数论

n people are standing on a coordinate axis in points with positive integer coordinates strictly less than 106. For each person we know in which direction (left or right) he is facing, and his maximum speed. You can put a bomb in some point with non-n

Educational Codeforces Round 21 Problem F (Codeforces 808F) - 最小割 - 二分答案

Digital collectible card games have become very popular recently. So Vova decided to try one of these. Vova has n cards in his collection. Each of these cards is characterised by its power pi, magic number ci and level li. Vova wants to build a deck

【二分答案+贪心】UVa 1335 - Beijing Guards

Beijing was once surrounded by four rings of city walls: the Forbidden City Wall, the Imperial City Wall, the Inner City Wall, and finally the Outer City Wall. Most of these walls were demolished in the 50s and 60s to make way for roads. The walls we

Luogu P1084 疫情控制 | 二分答案 贪心

题目链接 观察题目,答案明显具有单调性. 因为如果用$x$小时能够控制疫情,那么用$(x+1)$小时也一定能控制疫情. 由此想到二分答案,将问题转换为判断用$x$小时是否能控制疫情. 对于那些在$x$小时内不能够走到根节点的子节点上的军队,让他们尽量往上走即可,走到哪里是哪里,这样显然不会更劣. 对于那些在$x$小时内能走到根节点的子节点上的军队,就让他们先走到根节点的子节点上. 然后搞搞贪心即可. #include<iostream> #include<cstdio> #incl

[CSP-S模拟测试]:kill(二分答案+贪心)

题目传送门(内部题50) 输入格式 第一行包含四个整数$n,m,s$,表示人数.怪物数及任务交付点的位置.第二行包含$n$个整数$p_1,p_2,...,p_n$.第三行包含$n$个整数$q_1,q_2,...,q_n$. 输出格式 输出一行包含一个整数$ans$,表示答案. 样例 样例输入: 2 4 52 106 1 4 8 样例输出: 5 数据范围与提示 样例解释: 第一个人打位置为$4$的怪物,第二个人打位置为$8$的怪物,前者花$3$的时间,后者花$5$的时间,该方案对应的时间为$5$,

BC 2015年百度之星程序设计大赛 - 初赛(1)(序列变换-二分答案贪心)

序列变换 Accepts: 816 Submissions: 3578 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Description 给定序列A={A 1 ,A 2 ,...,A n } , 要求改变序列A中的某些元素,形成一个严格单调的序列B(严格单调的定义为:B i <B i+1 ,1≤i<N ). 我们定义从序列A到序列B变换的代价为cost(A,B