【题目描述:】

陶陶是个贪玩的孩子,他在地上丢了A个瓶盖,为了简化问题,我们可以当作这A个瓶盖丢在一条直线上,现在他想从这些瓶盖里找出B个,使得距离最近的2个距离最大,他想知道,最大可以到多少呢?

【输入格式:】

第一行,两个整数,A,B。(B<=A<=100000)

第二行,A个整数,分别为这A个瓶盖坐标。

【输出格式:】

仅一个整数,为所求答案。

【算法分析:】

关于单调性的感性证明:

  如果一个mid作为最大值时所选的瓶盖数量 x≥B,即最大值过小导致选取瓶盖过多,

  则答案一定在[mid + 1, r]内

  否则答案在[l, mid]内

满足单调性,可以二分答案。

关于check函数:

在check一个数mid时,check函数返回mid作为最大值时的选取瓶盖数量,

  这里可以做一个优化,即check返回一个bool类型

  当选取的瓶盖数量超过读入的B时,直接返回1,表示二分[mid + 1, r]这个区间

将数据从小到大排序来实现check函数:

  读入有n个元素的序列a,最大值为max

  利用贪心的思想,由于是求最少选取的瓶盖数量,能不选这个瓶盖的时候就不选

  last表示上一次选取的瓶盖位置

  当且仅当 ai - last > max 时,不选取ai会导致最大值变大,last更新成ai,选取的瓶盖个数+ 1

关于上下界的初始化:

  二分时上下界的初始选择可以是[0, INF],最多进行31次查找。

  只选取两个瓶盖时的最大值为amax - amin ,由于数据已经排好序,上界直接初始化成 an - a1 即可

【代码:】

 //丢瓶盖
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std; const int MAXN = + ;
const int INF = 0x7fffffff; int n, m;
int a[MAXN]; bool check(int num) {
int ret = , last = a[];
for(int i = ; i <= n; i++) {
if(a[i] - last > num) last = a[i], ret++;
if(ret >= m) return true;
}
return ret >= m;
}
int main() {
scanf("%d%d", &n, &m);
int l = , r = INF;
for(int i = ; i <= n; i++) {
scanf("%d", &a[i]);
}
sort(a + , a + n + );
r = a[n] - a[];
while(l < r) {
int mid = (l + r) >> ;
if(check(mid)) l = mid + ;
else r = mid;
}
printf("%d\n", l);
}

【洛谷】【二分答案+贪心】P1316 丢瓶盖的更多相关文章

  1. 洛谷 P1316 丢瓶盖

    P1316 丢瓶盖 题目描述 陶陶是个贪玩的孩子,他在地上丢了A个瓶盖,为了简化问题,我们可以当作这A个瓶盖丢在一条直线上,现在他想从这些瓶盖里找出B个,使得距离最近的2个距离最大,他想知道,最大可以 ...

  2. 洛谷3933 Chtholly Nota Seniorious 二分答案+贪心

    题目链接 题意 给你一个N*M的矩阵 (N,M <=2000)  把他分成两部分 使两部分的极差较大的一个最小  求这个最小值.然后分矩阵的要求是:每个部分内部的方块之间,可以通过上下左右相互到 ...

  3. BZOJ_2196_[Usaco2011 Mar]Brownie Slicing_二分答案+贪心

    BZOJ_2196_[Usaco2011 Mar]Brownie Slicing_二分答案+贪心 Description Bessie烘焙了一块巧克力蛋糕.这块蛋糕是由R*C(1 <= R,C ...

  4. 洛谷P1316 丢瓶盖【二分】【贪心】

    题目:https://www.luogu.org/problemnew/show/P1316 题意: 给定a个点的坐标(在一条直线上),现在要选b个点,问这b个点的最近距离的最大值是多少. 思路: 感 ...

  5. P1182 数列分段`Section II` P1316 丢瓶盖 二分答案

    题目描述 对于给定的一个长度为N的正整数数列A-iA−i,现要将其分成M(M≤N)M(M≤N)段,并要求每段连续,且每段和的最大值最小. 关于最大值最小: 例如一数列4 2 4 5 142451要分成 ...

  6. 洛谷P1316 丢瓶盖

    题目描述 陶陶是个贪玩的孩子,他在地上丢了A个瓶盖,为了简化问题,我们可以当作这A个瓶盖丢在一条直线上,现在他想从这些瓶盖里找出B个,使得距离最近的2个距离最大,他想知道,最大可以到多少呢? 输入输出 ...

  7. [LUOGU] P1316 丢瓶盖

    题目描述 陶陶是个贪玩的孩子,他在地上丢了A个瓶盖,为了简化问题,我们可以当作这A个瓶盖丢在一条直线上,现在他想从这些瓶盖里找出B个,使得距离最近的2个距离最大,他想知道,最大可以到多少呢? 输入输出 ...

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

    Beijing was once surrounded by four rings of city walls: the Forbidden City Wall, the Imperial City ...

  9. 【二分答案+贪心】解决“最小值最大”问题(UVa 12124 - Assemble)

    Problem A - Assemble Time limit: 2 seconds Recently your team noticed that the computer you use to p ...

随机推荐

  1. 啰里吧嗦redis

    1.redis是什么 redis官网地址 Redis is an open source (BSD licensed), in-memory data structure store, used as ...

  2. Java并发常见问题

    ConcurrentHashMap源码分析,参考:http://blog.csdn.net/do_smile/article/details/46911727 HashMap源码分析,参考:http: ...

  3. 浅谈equals和==

    在java中equals和==都是用来作比较的,可是你知道他们之间有什么区别和联系吗? 首先,在Object类中,本质上equals和==都是一样的,如果查看源码,你会发现这里面equals的内部实现 ...

  4. [js常用]连续播放音频

    许多音频连续播放.有的时候音频过大会分成多个音频.播放的时候需要连续播放 <!DOCTYPE HTML> <html> <head> <meta charse ...

  5. AGC006C Rabbit Exercise

    传送门 设 \(f_{i,j}\) 表示兔子 \(i\) 在当前 \(j\) 轮的期望位置 对于一次操作 \(f_{i,j+1}=\frac{1}{2}(2f_{i-1,j}-f_{i,j})+\fr ...

  6. 基于token的后台身份验证(转载)

    几种常用的认证机制 HTTP Basic Auth HTTP Basic Auth简单点说明就是每次请求API时都提供用户的username和password,简言之,Basic Auth是配合RES ...

  7. 移动端实现上拉加载更多(使用dropload.js vs js)

    做下笔记,:移动端实现上拉加载更多,其实是数据的分段加载,在这里为了做测试我写了几个json文件作为分段数据: 方式一:使用dropload.js; 配置好相关参数及回调函数就可使用:代码如下 var ...

  8. dojox.grid.DataGrid显示数据的方法(转)

    第一种:数据存在本地或者已经写死的JSON对象中,不需要跟服务端进行数据传输 <%@ page language="java" contentType="text/ ...

  9. flutter控件之CheckBox

    import 'package:flutter/material.dart'; class LearnCheckBox extends StatefulWidget{ @override State& ...

  10. Django ORM字段类型 单表增删改查 万能的双下划线

    1.ORM三种模型 模型之间的三种关系:一对一,一对多,多对多. 一对一:实质就是在主外键(author_id就是foreign key)的关系基础上,给外键加了一个UNIQUE=True的属性: 一 ...