南阳nyoj586疯牛 和nyoj619详解总结

这里先看nyoj619青蛙过桥,这样便于理解这两道题的共同点:最大值中的最小值,

题意:有一条河长L,中间有 n 块石头,青蛙最多可以跳 m 次,问题是:要保证青蛙能跳过去,那么它至少能一下跳多远,才能在m次范围内跳过去;

最大值中的最小值:这里要保证m次能跳过去,那么在这个过程中就会有很多种方法能在m次之内跳过去,那么,每一个方法中,我们就会有一个最大的跳跃距离!

比如:L=20,n=1;m=2;石头的位置是5

那么方法有:1.一次就跳过去,2.借助中间的石头,两次跳过去;那么在方法一中的最大的距离就是20,在第二种方法中,最大的距离就是15,那么方法二中的最大值15就是所有最大值中的最小的一个,也就是保证青蛙跳过去的至少能跳的距离。

解决:这里要用到二分加贪心

二分时候,区间(l,r),l是石头两两之间最大的距离,r是L河宽,mid=(l+r)/2作为每次应该跳跃的距离,然后二分贪心;

贪心过程中,对于二分中的每一个mid的值,我们贪心求出以这个距离跳跃,能多少次跳过河!

上马,代码中注释:

#include <iostream>
#include <algorithm>
using namespace std;

#define MAX 500005

int L,n,m;
int stone[MAX];

int jump(int x)
{
    int cnt = 1;
    int sum = 0;//青蛙每次的起跳点,初始为0
    for(int i = 0; i <= n; i ++)
    {
        if(stone[i] - sum == x )//如果这个石头到sum这点的距离刚好是x,那么刚好能跳过,sum更新为这个石头坐标
        {
            cnt ++;
            sum = stone[i];
        }
        else if(stone[i] - sum > x)//青蛙不能从sum跳到stone,那么,sum就更新为前面那个石头的坐标
        {
            cnt ++;
            sum = stone[i-1];
        }
    }
    return cnt;
}

int main()
{
    while(cin>>L>>n>>m)
    {
        for(int i = 0; i < n; i ++) cin>>stone[i];
        sort(stone,stone+n);
        stone[n] = L; //把河的宽度加入

        int l,r;
        r = L;
        l = 0;
        for(int i = 1; i <= n; i ++)//找二分区间的左值
        {
            if(stone[i] - stone[i-1] > l) l = stone[i]-stone[i-1];
        }

        int mid;
        while(l <= r)
        {
            mid = (l+r)/2;
            if(jump(mid) <= m) r = mid-1;
            else l = mid+1;
        }
        cout <<l<<endl;
    }
    return 0;
}

nyoj586疯牛

这里和上面只有一点点区别:

第一:二分区间的左右值(0,cow[n-1]-cow[0]);(排好序之后的);

第二:青蛙那题是跳的次数,而这里是安排的牛数,就像线段上的点的关系一样,一个线段,两个端点,类似于青蛙要跳一次,但是可以安排两头牛在两个端点上,那么这里二分的时候,判断就应该是 <= c-1;  而不是青蛙那里的 <=m

第三就是贪心过程中,不要区分 == x 和 > x的情况

具体看代码:

#include <iostream>
#include <algorithm>
using namespace std;

#define MAX 100005

int n,c;
int cow[MAX];

int din(int x)
{
    int cnt = 1;
    int sum = cow[0];
    for(int i = 1; i < n; i ++)
    {
        if(cow[i] - sum >= x) //不要区分,满足就把牛放在这点,sum更新为此点坐标,应为青蛙那不能跳过来,就是前面一点
        {
            cnt ++;
            sum = cow[i];
        }
    }
    return cnt;
}

int main()
{
    while(cin>>n>>c)
    {
        for(int i = 0; i < n; i ++) cin >> cow[i];
        sort(cow,cow+n);

        int l = 0;
        int r = cow[n-1]-cow[0];

        int mid;
        while(l <= r)
        {
            mid = (l+r)/2;
            if(din(mid) <= c-1) r = mid-1;
            else l = mid+1;
        }
        cout<<l-1<<endl;
    }
    return 0;
}

个人愚昧观点,欢迎讨论与指正

南阳nyoj586疯牛 和nyoj619详解总结,布布扣,bubuko.com

时间: 2024-08-06 08:15:03

南阳nyoj586疯牛 和nyoj619详解总结的相关文章

VM参数详解和调优

bytes.writeInt(group); >> 5:客户端通过服务器来将消息转发给其他人(这里有点复杂,因为转发功能有点多,不需要就不用看了) 接下来就有点麻烦了(其实很简单,因为好多都用不到),先描述下转发规则: 0 所有组的所有人 bytes.writeInt(4 + 4 + data.length); bytes.writeInt(CSEnum.RELAY); bytes.writeInt(0);                                           

java 枚举详解

在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的. 例如星期一到星期日七个数据元素组成了一周的“数据集”,春夏秋冬四个数据元素组成了四季的“数据集”. 在java中如何更好的使用这些“数据集”呢?因此枚举便派上了用场,以下代码详细介绍了枚举的用法. package com.ljq.test; /** * 枚举用法详解 * * @author jiqinlin * */public class TestEnum {    /**     * 普通

Android安卓书籍推荐《Android驱动开发与移植实战详解》下载

百度云下载地址:点我 Android凭借其开源性.优异的用户体验和极为方便的开发方式,赢得了广大用户和开发者的青睐,目前已经发展成为市场占有率很高的智能手机操作系统. <Android驱动开发与移植实战详解>分为18章,依次讲解了Android系统的基本知识, Linux内核的基本知识,分析了Android系统的源码,深入分析HAL层的基本知识,GoldFish下的驱动.MSM内核和驱动.OMAP内核和驱动.显示系统驱动.输入系统驱动.振动器系统驱动.音频系统驱动和视频输出系统驱动,多媒体框架

Spring事务管理(详解+实例)

写这篇博客之前我首先读了<Spring in action>,之后在网上看了一些关于Spring事务管理的文章,感觉都没有讲全,这里就将书上的和网上关于事务的知识总结一下,参考的文章如下: Spring事务机制详解 Spring事务配置的五种方式 Spring中的事务管理实例详解 1 初步理解 理解事务之前,先讲一个你日常生活中最常干的事:取钱. 比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱:然后ATM出1000元钱.这两个步骤必须是要么都执行要么都

转载:DenseNet算法详解

原文连接:http://blog.csdn.net/u014380165/article/details/75142664 参考连接:http://blog.csdn.net/u012938704/article/details/53468483 本文这里仅当学习笔记使用,具体细节建议前往原文细度. 论文:Densely Connected Convolutional Networks 论文链接:https://arxiv.org/pdf/1608.06993.pdf 代码的github链接:h

MariaDB(MySQL)创建、删除、选择及数据类型使用详解

一.MariaDB简介(MySQL简介略过) MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品.在存储引擎方面,使用XtraDB(英语:XtraDB)来代替MySQL的InnoDB. MariaDB由MySQL的创始人Michael Widenius(英语:Michael Widenius)主导开发,他早前曾以10亿美元的价格,将自己创建的公司MySQL A

HttpServletResponse和HttpServletRequest详解

HttpServletResponse,HttpServletRequest详解 1.相关的接口 HttpServletRequest HttpServletRequest接口最常用的方法就是获得请求中的参数,这些参数一般是客户端表单中的数据.同时,HttpServletRequest接口可以获取由客户端传送的名称,也可以获取产生请求并且接收请求的服务器端主机名及IP地址,还可以获取客户端正在使用的通信协议等信息.下表是接口HttpServletRequest的常用方法. 说明:HttpServ

POSIX 线程详解(经典必看)

总共三部分: 第一部分:POSIX 线程详解                                   Daniel Robbins ([email protected]), 总裁/CEO, Gentoo Technologies, Inc.  2000 年 7 月 01 日 第二部分:通用线程:POSIX 线程详解,第 2部分       Daniel Robbins ([email protected]), 总裁/CEO, Gentoo Technologies, Inc.  20

.NET深入解析LINQ框架(五:IQueryable、IQueryProvider接口详解)

阅读目录: 1.环路执行对象模型.碎片化执行模型(假递归式调用) 2.N层对象执行模型(纵横向对比链式扩展方法) 3.LINQ查询表达式和链式查询方法其实都是空壳子 4.详细的对象结构图(对象的执行原理) 5.IQueryable<T>与IQueryProvider一对一的关系能否改成一对多的关系 6.完整的自定义查询 1]. 环路执行对象模型.碎片化执行模型(假递归式调用) 这个主题扯的可能有点远,但是它关系着整个LINQ框架的设计结构,至少在我还没有搞懂LINQ的本意之前,在我脑海里一直频