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
  • 3215

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
  • 322

51Nod-1435-位数阶乘

ACM模版描述题解这道题猛一看比较咋呼人,但是仔细分析下来,会发现十分简单,关键是拆解每一位数,拆解成质因数的形式,然后统计每个质因数一共出现的次数,在寻找正整数X(ans[])时,只要按从大到小的顺...
  • f_zyj
  • f_zyj
  • 2016-09-19 13:32
  • 135

51Nod-1186-质数检测 V2

ACM模版描述题解伪随机素数检测,Miller-Rabin算法,如果用Java神马的有大数相关类型的话,就是一个模版题,套用一下这个算法模版就好了,然而如果用C++,那么这道题足够惨痛了,Miller...
  • f_zyj
  • f_zyj
  • 2016-08-13 18:27
  • 552

51Nod-1102-面积最大的矩形

ACM模版描述题解类似于在(某一区间中最小值*此区间所有元素之和)最大的问题,这里是(某一区间中最小值*此区间宽度)最大的问题。 此类问题可以使用单调栈来实现,使问题可以在O(N)的复杂度中解决。 ...
  • f_zyj
  • f_zyj
  • 2016-08-07 18:29
  • 364

51Nod-1057-N的阶乘

输入N求N的阶乘的准确值。 Input 输入N(1 <= N <= 10000) Output 输出N的阶乘 Input示例 5 Output示例 120遇见这道题,也是我的运气,因为...
  • f_zyj
  • f_zyj
  • 2016-04-19 02:14
  • 700

51Nod-1316-回文矩阵

ACM模版描述题解这道题搞得我挺焦虑的,矩阵不大,可以暴力枚举。枚举所有的组合,然后在这些组合内部,先固定选取的行,然后遍历列,保证遍历完后,选取的行都是回文的;然后再固定选取的列,接着遍历行,保证遍...
  • f_zyj
  • f_zyj
  • 2016-09-03 15:03
  • 545

51Nod-1267-4个数和为0

ACM模版描述题解这道题数据有些弱,O(n^3)的复杂度可以过,但是需要进行剪枝。当然也有好一些的算法,用哈希优化到O(N^2)。代码One:#include #include #include ...
  • f_zyj
  • f_zyj
  • 2016-08-08 16:51
  • 440
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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