hdu4004(二分)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4004

大致题意 二分最大跳跃能力,判断是否可以在m次内到达对岸!

分析:由于求青蛙最小弹跳能力,所以二分不断枚举能力x,再对x判断是否在m次内到达对岸。。。

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <cstdlib>
#include <vector>
#include <set>
#include <map>
#define LL long long
#define inf 1<<30
using namespace std;

int n,m,l,a[500010];
int judge(int x)
{
    int res=0,temp=0;
    for(int i=1;i<=n;i++)
    {
        if(a[i]-temp>x)return 0;
        while(a[i]-temp<=x&&i<=n)i++;
        temp=a[i-1];i--;
        res++;
    }
    return res<=m;
}
int main()
{
    while(scanf("%d%d%d",&l,&n,&m)>0)
    {
        for(int i=1;i<=n;i++)scanf("%d",&a[i]);
        a[++n]=l;
        sort(a+1,a+n+1);
        int left=0,right=l,mid,ans;
        while(left<=right)
        {
            mid=(left+right)/2;
            if(judge(mid))
                right=mid-1,ans=mid;
            else left=mid+1;
        }
        printf("%d\n",ans);
    }
}

时间: 2024-10-09 09:36:53

hdu4004(二分)的相关文章

hdu4004 简单二分+贪心

找到二分的左右值  然后对每一个中值进行判断 #include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> using namespace std; int n,m,L; int num[500010]; int abs(int a) { return a<0?-a:a; } int max(int a,int b) { return a>b?a:b; }

HDU4004——The Frog&#39;s Games

http://acm.hdu.edu.cn/showproblem.php?pid=4004 这道题讲的是青蛙在限定步骤之内跳过河,所以判断最小的每次跳的步长. 思路理解:找到每块石头之间的最大值为石头最小步长,最大值当然就是河宽了.所以剩下了就是用二分枚举了. //我烦的一个错误就是sort函数是从0-n(sort(a,a+n);); #include<stdio.h> #include<iostream> #include<cstring> #include<

2.1 二分分类

本周学习神经网络编程的基础知识 构建神经网络,有些技巧是非常重要 神经网络的计算过程中,通常有一个正向的过程(正向传播步骤),接着会有一个反向步骤(反向传播步骤), 为什么神经网络的计算可以分为前向传播和反向传播两个分开的过程?本周课程通过使用logistic回归来阐述,以便于能够更好的理解, logistic回归是一个用于二分分类的算法 比如有一个二分分类问题的例子, 假如有一张图像作为输入是这样的,你想输出识别此图的标签,如果是猫,输出1,如果不是,则输出0 使用y来表示输出的结果标签, 来

HDU3715(二分+2-SAT)

Go Deeper Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 3184    Accepted Submission(s): 1035 Problem Description Here is a procedure's pseudocode: go(int dep, int n, int m)beginoutput the valu

二分查找

递归版(在区间[x, y)中找v的位置) 1 //递归版二分查找 2 int bsearch(int * A, int x, int y, int v) 3 { 4 5 if(v<a[x] || v>a[y-1]) return -1; 6 int m = x + (y-x)/2; //此处能不能用int m = (x+y)/2,需要仔细考虑(暂时想不到原因) 7 if(A[m]==v) return m; 8 else if(A[m]>v) return bsearch(A, x, m

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

二分查找总结

最近刷leetcode和lintcode,做到二分查找的部分,发现其实这种类型的题目很有规律,题目大致的分为以下几类: 1.最基础的二分查找题目,在一个有序的数组当中查找某个数,如果找到,则返回这个数在数组中的下标,如果没有找到就返回-1或者是它将会被按顺序插入的位置.这种题目继续进阶一下就是在有序数组中查找元素的上下限.继续做可以求两个区间的交集. 2.旋转数组问题,就是将一个有序数组进行旋转,然后在数组中查找某个值,其中分为数组中有重复元素和没有重复元素两种情况. 3.在杨氏矩阵中利用二分查

BZOJ 1044 木棍分割 解题报告(二分+DP)

来到机房刷了一道水(bian’tai)题.题目思想非常简单易懂(我的做法实际上参考了Evensgn 范学长,在此多谢范学长了) 题目摆上: 1044: [HAOI2008]木棍分割 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3162  Solved: 1182[Submit][Status][Discuss] Description 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个

hdu_5884_Sort(二分+单调队列)

题目链接:hdu_5884_Sort 题意: 有n个数,每个数有个值,现在你可以选择每次K个数合并,合并的消耗为这K个数的权值和,问在合并为只有1个数的时候,总消耗不超过T的情况下,最小的K是多少 题解: 首先要选满足条件的最小K,肯定会想到二分. 然后是如何来写这个check函数的问题 我们要贪心做到使消耗最小,首先我们将所有的数排序 然后对于每次的check的mid都取最小的mid个数来合并,然后把新产生的数扔进优先队列,直到最后只剩一个数. 不过这样的做法是n*(logn)2 ,常数写的小