=================================================
废柴日记3:连菜市场大妈都理解的二分问题
=================================================
--------------------------------------------------------------------------------------
日期:2021年9月12日 天气:多云转晴
--------------------------------------------------------------------------------------
其实,我每天都还好。
一开始我觉得日更是一件非常难的事。
虽然博主很菜,但是博主也是一只有梦想的咸鱼,就算是不更也不会去水一篇博客。
但是我发现,根本不需要我去想该更新什么内容,每天晚上的8点之前一定会有一个人/事情告诉我今天所要水(gan)的内容。
周赛刚结束,学长发现一批人竟然不理解最大化最小值与最小化最大值问题,不说他了,我当时血压就上来了:啊?不会吧?不会有人1202年都还不会最大化最小值与最小化最大值问题吧?菜市场的阿姨都熟练于心的问题啊!
正好没找到好的内容可以写,那么我们这次来介绍一下连你家附近菜市场阿姨都会的问题吧~
连菜市场大妈都理解的二分问题
小的时候博主比较笨,看起来不太聪明的样子。我妈每次出门买菜都会带着我,生怕我在家里闹出什么事情。
每次我妈有看中的菜时,都会问卖菜的阿姨:“恁这白菜怎么卖得?”
此时卖菜的阿姨会给出一个价格 R : “ 6块钱一斤。”(假设,只是假设)R==6
这时候如果我妈觉得价格不合适,就会给出一个她觉得可以接受的价格 L :“噫,恁贵得,3块钱一斤卖不卖?” L==3
“不行不行,那俺不得赔死了?给你便宜一点,5块钱一斤。” R==5
“那也还是怪贵得,那俺也回回都搁你这买耶,再便宜点呗,4块一斤卖不卖?” L==4
“那算了吧,恁还是去别地儿买去吧,照你那么卖俺不得亏死?”
一般这个时候,我妈就会拉着我准备走,那个阿姨一看,想了想:“4块5,你看行不行?不能再少了,真不赚钱。” R==4.5
“行吧,给我来两斤。” L==4.5
上面的故事之中,我妈和菜市场大妈的讨价还价其实就是在处理二分问题中的一个经典问题:最大化最小值与最小化最大值问题。
有的人可能会说了:“啊,这博主坑人,那你妈小学都没毕业,怎么可能懂这么难的问题呢?”
如果我们把两者维护的值看为两个值:
- 对于我妈来说,一开始白菜的价格其实是一个最大值,作为买家,我妈的想法肯定是要让这个价格尽可能地小;
- 对于卖菜阿姨来说,我妈提出的价格其实是一个最小值,作为卖家,阿姨的想法肯定是让这个价格尽可能地大;
这和我们所学的最大化最小值与最小化最大值问题不是一个问题吗?
多说无益必自闭,我们上题!
典中典的最大化最小值问题:过河问题
River Hopscotch - POJ 3258 - Virtual Judgehttps://vjudge.ppsucxtt.cn/problem/POJ-3258
题意
现在有一条河,河的左岸与右岸的距离为L米。
在河中有N(0<=N<=50000)个石头,每个石头距离左岸Di米。
每两个石头之间有一段距离差,你可以最多拿走M个石头,求拿走石头之后剩下的石头群中最小的距离差最大可以是多少?
博主の脑回路
这道题简直就是典中典中典,花京院典明的经典程度。
我们就假设这个最小的距离差为 X 。
那么首先我们要利用已知的信息来约束这个 X 的值,就像是白菜的价格,再怎么变化也是在一个范围之内的。我们很轻松的知道:0 <= X <= L。
接下来我们二分这个 X 的值,每次需要判断当前的 X 是否合适,如果需要调整的话又该如何调整。
头脑风暴结束,上代码。
AC代码
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e5+100;
int a[maxn];
int l,n,m;
bool check(int x)
{
int cnt=0;
int pos=0,now_p=1;
while(now_p<=n+1)
{
if(a[now_p]-a[pos]>=x)
pos=now_p;
else
cnt++;
now_p++;
}
return cnt<=m;
}
int main()
{
cin>>l>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
a[0]=0;a[n+1]=l;
sort(a,a+2+n);
int left=0,right=l;
while(left<=right){
int mid=(left+right)/2;
if(check(mid))
left=mid+1;
else
right=mid-1;
}
cout<<right<<endl;
}
我妈和我去买菜的故事并不是真实版本,事实上我妈带我去买菜只是因为怕我在家里只看电视,把眼睛看坏了。
我不知道这对我现在两只眼睛都300+度是否有影响,我只知道誓为日更博主的我再次维护了世界的和平,睡觉!