51Nod-1243-排船的问题

原创 2016年08月28日 18:27:19

ACM模版

描述

描述

题解

万万没想到,这道题用的是二分……

对绳子长度进行二分,然后逐个对比,看能否排放下所有船只,绳子长度在0~M-1之间,所以……顺理成章的二分,只是查找的不是v,而是长度为mid的绳子能否拴住所有的船,这里我们用int judge(int d)函数来判断,如果能拴住,则说明最长绳子的长度最短小于等于d,否则大于等于d,可AC……

代码

#include <iostream>
#include <cstdio>
#include <cmath>

using namespace std;

const int MAXN = 5e4 + 5;

int N, X, M;
int P[MAXN];

int judge(int d)
{
    int st = 2 * X;                     //  船尾可以放置的首位置
    for (int i = 0; i < N; i++)
    {
        if (abs(st - P[i] - X) <= d)    //  绳子的长度小于等于d
        {
            st += 2 * X;                //  推移到下一个位置
        }
        else
        {
            if (P[i] - d + X > st)      //  如果在绳长为d时,可以放下船
            {
                st = P[i] - d + X;      //  更新首位置
            }
            else
            {
                return 0;
            }
            st += 2 * X;                //  推移到下一个位置
        }
    }
    if (st - 2 * X > M)                 //  最后一个船越界了
    {
        return 0;
    }
    return 1;
}

//  二分
int bs(int left, int right)
{
    int ans = M;
    int mid;
    while (left <= right)
    {
        mid = (left + right) >> 1;
        if (judge(mid))
        {
            ans = mid;
            right = mid - 1;
        }
        else
        {
            left = mid + 1;
        }
    }
    return ans;
}

int main(int argc, const char * argv[])
{
    cin >> N >> X >> M;

    if (2 * X * N > M)
    {
        cout << "-1\n";
        return 0;
    }

    for (int i = 0; i < N; i++)
    {
        scanf("%d", P + i);
    }

    //  二分,绳子长度为0到M-1
    int ans = bs(0, M - 1);

    std::cout << ans << '\n';
    return 0;
}

参考

《二分查找》

版权声明:听说这里让写版权声明~~~

51nod 1243 排船的问题

二分,分了老半天也没分出来结果,只好跑去找题解 参考:http://www.cnblogs.com/TheRoadToTheGold/p/6421882.html 这题还有O(n)解法,后边讨论里...

51nod 1243 排船的问题(锻炼思维的好题)

一个码头中有N艘船和N个木桩,船的长度为2*X,码头的宽度为M,N个木桩的位置(相对码头左岸的位置)会在数据中给出。船和船之间不能重叠,即每艘船的船头不能超过上一艘船的船尾,当然也不能超出码头的两岸。...
  • caduca
  • caduca
  • 2015年08月31日 18:58
  • 3283

1364 最大字典序排列

萌萌哒的传送门 System Messag 大神的题解。这个题目明显是要贪心的。从前往后每次看看能不能拿一个大的放到当前数字的前面,而且要拿尽可能大的。这样字典序才会变成最大。 原数组...

51Nod-1364-最大字典序排列

ACM模版描述题解典型的贪心,每次都找能够移过来前边的最大值,记住是能够,所以我们需要在剩余的操作次数可以满足的范围内找到最大值,不断查找,不断移动输出,此时,存在一个问题,N、K 太大了,每次查找和...
  • f_zyj
  • f_zyj
  • 2017年06月16日 02:31
  • 253

51NOD1243 排船的问题 【二分+贪心】

1243 排船的问题 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 一个码头中有N艘船和N个木桩,船的长度为2*X,码...

51Nod-1086-背包问题 V2

ACM模版描述题解这里提供三种代码,前两种方法一致,复杂度O(V*Σlog n[i]),不同的是,第二个是模版;第三种代码最优,复杂度为O(VN),可惜十分不好理解,具体推导过程不再赘述,有些懵懵懂懂...
  • f_zyj
  • f_zyj
  • 2016年08月15日 01:40
  • 376

51nod 1096 距离之和最小 && 1108-距离之和最小 V2(简单数学)&& 1110 距离之和最小 V3(逆思维)

1096 距离之和最小 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  关注 X轴上有N个点,求X轴上一点使它到这N个点的距离之和最...

51Nod-1414-冰雕

ACM模版描述题解一开始高估了这道题难度,一直在想从中发现规律( ̄┰ ̄*),结果,╮(╯_╰)╭,只好暴力解之……还真的过了,这里给出一种一般的暴力解法和一种略微优化的暴力解题思路。代码One:// ...
  • f_zyj
  • f_zyj
  • 2016年08月13日 02:15
  • 182

51Nod-1134-最长递增子序列

给出长度为N的数组,找出这个数组的最长递增子序列。(递增子序列是指,子序列的元素是递增的) 例如:5 1 6 8 2 4 5 10,最长递增子序列是1 2 4 5 10。 Input 第1行:1...
  • f_zyj
  • f_zyj
  • 2016年04月29日 03:12
  • 820

51Nod-1316-回文矩阵

ACM模版描述题解这道题搞得我挺焦虑的,矩阵不大,可以暴力枚举。枚举所有的组合,然后在这些组合内部,先固定选取的行,然后遍历列,保证遍历完后,选取的行都是回文的;然后再固定选取的列,接着遍历行,保证遍...
  • f_zyj
  • f_zyj
  • 2016年09月03日 15:03
  • 632
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:51Nod-1243-排船的问题
举报原因:
原因补充:

(最多只允许输入30个字)