首页 > 其他分享 >进击的奶牛题解

进击的奶牛题解

时间:2024-09-26 22:50:24浏览次数:11  
标签:sort upper 进击 题解 隔间 bound int 二分 奶牛

题目描述

Farmer John 建造了一个有 N(2≤N≤105) 个隔间的牛棚,这些隔间分布在一条直线上,坐标是 x1,x2,⋯ ,xN​(0≤xi≤109)。

他的 C(2≤C≤N)头牛不满于隔间的位置分布,它们为牛棚里其他的牛的存在而愤怒。为了防止牛之间的互相打斗,Farmer John 想把这些牛安置在指定的隔间,所有牛中相邻两头的最近距离越大越好。那么,这个最大的最近距离是多少呢?

输入格式

第 11 行:两个用空格隔开的数字 N 和 C。

第 2∼N+12∼N+1 行:每行一个整数,表示每个隔间的坐标。

输出格式

输出只有一行,即相邻两头牛最大的最近距离。

输入输出样例

输入 #1

5 3
1
2
8
4
9

输出 #1

3

这道题怎么可能是红题?

我认为此题为红题的原因是可以用STL

思路

尽管样例是按顺序给的,但事实上位置未必是按顺序的,为了方便计算,首先要排序

排完序后,对于每一头牛,只需要找到后面的所有和它的距离小于dd的,累计一下就好了。

不过,数据范围很大,一个一个找一定超时,需要优化,用到二分

这样只需要把二分结果前面的所有牛加起来就行了。

代码

STL是个好东西。我用到了这里的两个函数:sort和upper_bound。

sort

这个函数相信大家都很熟悉,就是给数组排个序。

用法:sort(a.begin(),a.end())。这样可以给数组从小到大排个序。放在这道题里就是:

sort(a+1,a+n+1);//数组从1开始

当然这个函数不仅仅可以从小到大,可以从大到小或结构体排序,这些东西大佬们一定知道,这里就不赘述了。

upper_bound

没错,这才是这个代码的核心部分。它的作用是二分查找一个数在数组中出现的位置。

用法:upperupper_bound(a.begin(),a.end(),num)。这样可以在数组中找到第一个大于num的数的地址,如果不存在就返回end。而由于是地址,就需要在最后减去a。

放在这道题里就是:

int k=upper_bound(a+i+1,a+n+1,a[i]+d)-a;//返回地址,要减去a的地址

有一个和此函数差不多的函数,叫做lowerbound,只是把上面的“大于”改成“大于等于”。但这道题用的是upperbound。

在这里需要注意目前遍历的牛(即ii)和二分结果(即kk)都不算在内,所以这里结果要加k−i−1。

代码

相信没有多少人喜欢上面的一通分析吧,那么,你们喜欢的代码来了——

代码长度17行(还没上面的分析长),时间48ms挺快

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e6 + 10;//n的最大值
int a[MAXN];
int main() {
    int n, d, ans = 0;
    cin >> n >> d;
    for (int i = 1; i <= n; i++) cin >> a[i];//输入
    sort(a + 1, a + n + 1);//sort;
    for (int i = 1; i <= n; i++) {//遍历每头奶牛
        int k = upper_bound(a + i + 1, a + n + 1, a[i] + d) - a;//upper_bound函数,二分
        ans += (k - i - 1);//保存,记录
    }
    cout << ans;//输出
    return 0;//华丽结束
}

在百忙之中写一篇题解也比较辛苦,别忘了点个赞!

标签:sort,upper,进击,题解,隔间,bound,int,二分,奶牛
From: https://blog.csdn.net/geogenotfound/article/details/142578270

相关文章

  • 奶牛分厩题解
    题目描述农夫约翰有 N(1≤N≤5000)头奶牛,每头奶牛都有一个唯一的不同于其它奶牛的编号 s[i],所有的奶牛都睡在一个有 K 个厩的谷仓中,厩的编号为 00 到 K−1。每头奶牛都知道自己该睡在哪一个厩中,因为约翰教会了它们做除法,Si mod K的值就是第 i 头奶年所睡的厩的编......
  • 易优cms安全设置常见问题_Eyoucms安全设置问题解决方法
    易优EyouCMS的安全设置对于保护网站免受攻击非常重要。下面列出了一些关于易优CMS安全设置的常见问题及其解决方法:1.目录权限设置为了防止未经授权的访问,应该合理设置网站目录的权限。例如,上传目录通常需要写入权限,而其他目录则应限制权限以防止恶意文件上传或执行。解决方法......
  • 勇攀山丘小队(翻越篇)2——题解
    前言胸有丘壑,气吞山河。正片A题思路其实很简单,当你以当前位置在\(i\),油量为\(p\)的地方开到了位置为\(j\),且\(p_{j+1}-i>p\)时,你肯定走不了了。因此你应当在\(i\)到\(j\)找到能加油最多的加油站来进行加油。需要动态维护这个最大值的数据结构我们可以利用堆来实......
  • 题解 QOJ837 / ZROI1287【Giant Penguin】
    PetrozavodskWinter2020.Day3.300iqContest3.ProblemG.GiantPenguinGiantPenguin-Problem-QOJ.ac题目描述有一个\(n\)个点\(m\)条边的连通无向无权图,满足每个节点在至多\(k\)个简单环上(没有重复顶点的环是简单环)。\(q\)次操作支持:1.标记一个点;2.询问......
  • 【Py/Java/C++三种语言OD独家2024E卷真题】20天拿下华为OD笔试之【哈希表】2024E-选修
    可上欧弟OJ系统练习华子OD、大厂真题绿色聊天软件戳oj1441了解算法冲刺训练(备注【CSDN】否则不通过)文章目录相关推荐阅读题目描述与示例题目描述输入输出示例一输入输出说明示例二输入输出说明解题思路代码pythonjavacpp时空复......
  • 【Py/Java/C++三种语言OD独家2024E卷真题】20天拿下华为OD笔试之【DFS/BFS】2024E-开
    可上欧弟OJ系统练习华子OD、大厂真题绿色聊天软件戳oj1441了解算法冲刺训练(备注【CSDN】否则不通过)文章目录相关推荐阅读题目描述与示例题目描述输入输出示例一输入输出说明示例二输入输出解题思路代码解法一:BFSpythonjavacpp......
  • LGP1313 题解
    原题链接:P1313[NOIP2011提高组]计算系数。难度:Easy。考察二项式定理的基本应用。正解发现存在式子\((ax+by)^k\),容易想到二项式定理。二项式定理:\[(x+y)^n=\sum\limits_{i=0}^{n}{n\choosei}x^iy^{n-i}\]令\(p=ax,q=by\),那么原式变为\((p+q)^k\)。那么此时......
  • LGB3717 题解
    原题链接:B3717组合数问题。难度:Easy组合数学的模板题。排除做法:\(n,m\le5\times10^6\),显然不能使用杨辉三角递推。模数为\(998,244,353\),无法使用\(\text{Lucas}\)定理。正解考虑直接使用组合数的计算式:\[{n\choosem}=\dfrac{n!}{m!(n-m)!}\]其中\(n!\)可......
  • P8908 [USACO22DEC] Palindromes P 题解
    P8908[USACO22DEC]PalindromesP题解算是好题,虽然没什么人做(简单地,我们考虑如何将一个字符串改变为回文串。显然如果我们判定所有\(\texttt{G}\)组成的是回文串,那么整个串一定是回文的。于是我们只考虑改变\(\texttt{G}\)的位置。那么由这类题的套路不难知道最优的变换......
  • 【洛谷】P1168 中位数 的题解
    【洛谷】P1168中位数的题解题目传送门题解不懂就问,这是什么标签啊,《线段树》《二分》《堆》《树状数组》qaq谔谔,教练讲的这是一题线段树,看半天看不出来,也不会做,只好去看题解。其他的题解讲什么主席树,平衡树,分块,结果看完第一篇人都傻了。什么东西嘛qaq(恼vector直接一......