话说二分和三分的题还没有整理过,就趁这两题来整理下笔记

先讲讲关于二分,对于二分的具体边界长期以来对我来说都是个玄学问题,都是边调边拍改对的。思路大体是确定左边界l,和有边界r,判断满足条件缩小范围。

放个大概的代码

while(l+ep<r){
lm=l+(r-l)/3.0;
rm=r-(r-l)/3.0;
if(clu(lm)>clu(rm)) l=lm;
else r=rm;
}

二分用处很大,一般用在二分答案以及二分查找,一般看到最大的最小或最小的最大都是二分答案或二分查找题,一般来说二分答案题的套路都大体一致。

二分答案:luogu P1182,P2678

二分查找:luogu P1496(离散化+二分查找)

关于三分,大概就是在二分的基础上,对左右区间再进行一次二分,三分查找一般用来确定单峰函数的最值

于二分类似先取中间值

mid=(l+r)>>1

再取mid于Right的中间值

rmid=(mid+r)>>1

通过f(mid)于f(rmid)的值来缩小范围

当然还有另外一种写法

1.先把整个区间的n/3的值lmid←n/3+left。

2.再取右侧区间的中间值rmid←right-n/3,从而把区间分为三个小区间。

3.用f(lmid)的值与f(rmid)的值来缩小范围

   double ep=1e-9;
while(l+ep<r){//使用ep来控制精度
lm=l+(r-l)/3.0;
rm=r-(r-l)/3.0;
if(clu(lm)>clu(rm)) l=lm;
else r=rm;
}

这样的时间复杂度是O(lon3n)

回到题目

1.愤怒的牛

题意:将c头牛放入相隔距离不同的n个牛舍中,要求任意两头牛相隔最小距离最大

对于这道题,我们可以二分查找,注意细节即可

#include<bits/stdc++.h>
using namespace std;
int n,l,r,c,a[100010];
int main(){
scanf("%d %d",&n,&c);
for(int i=1;i<=n;++i) scanf("%d",&a[i]);
sort(a+1,a+1+n);
l=0,r=a[n];
while(l<=r){
int mid=(l+r)>>1;
int cnt=1;//初始值为1,把第一头牛放到一号牛舍一定最优
int tmp=a[1];
for(int i=1;i<=n;++i){
if(a[i]-tmp>=mid){
cnt++;
tmp=a[i];
}
}
if(cnt<c) r=mid-1;
else l=mid+1;
}
printf("%d",r);
return 0;
}

2.曲线

题意:n个二次函数,第i个二次函数g(x)=aix^2+bix+ci( \(i \epsilon [1, n]\) )(二次函数可能退化为一次函数),f(x)=max(g(x))(n个二次函数中的最大值)

求f(x)在 \(x \epsilon [0, 1000]\) 的最小值,易证f(x)为单峰函数,三分查找即可

#include<bits/stdc++.h>
using namespace std;
int T,n;
double ep=1e-9;//控制精度
double a[10010],b[10010],c[10010];
double clu(double x){
double sum=0;
for(int i=1;i<=n;++i) sum=max(sum,((a[i]*x)+b[i])*x+c[i]);//展开即为g(x)
return sum;
}
int main(){
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=1;i<=n;++i){
scanf("%lf %lf %lf",&a[i],&b[i],&c[i]);
}
double l=0,r=1000,lm=0,rm=0;
while(l+ep<r){
lm=l+(r-l)/3.0;
rm=r-(r-l)/3.0;
if(clu(lm)>clu(rm)) l=lm;
else r=rm;
}
printf("%.4lf\n",clu(l));
}
return 0;
}

题解 yzoj1663: 愤怒的牛(二分) yzoj1662: 曲线(三分)的更多相关文章

  1. bzoj1734 [Usaco2005 feb]Aggressive cows 愤怒的牛 二分答案

    [Usaco2005 feb]Aggressive cows 愤怒的牛 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 407  Solved: 325[S ...

  2. BZOJ 1734: [Usaco2005 feb]Aggressive cows 愤怒的牛( 二分答案 )

    最小最大...又是经典的二分答案做法.. -------------------------------------------------------------------------- #inc ...

  3. B1734 [Usaco2005 feb]Aggressive cows 愤怒的牛 二分答案

    水题,20分钟AC,最大值最小,一看就是二分答案... 代码: Description Farmer John has built a <= N <= ,) stalls. The sta ...

  4. 1734: [Usaco2005 feb]Aggressive cows 愤怒的牛

    1734: [Usaco2005 feb]Aggressive cows 愤怒的牛 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 217  Solved: ...

  5. bzoj 1734: [Usaco2005 feb]Aggressive cows 愤怒的牛

    1734: [Usaco2005 feb]Aggressive cows 愤怒的牛 Description Farmer John has built a new long barn, with N ...

  6. bzoj 1734: [Usaco2005 feb]Aggressive cows 愤怒的牛【二分+贪心】

    二分答案,贪心判定 #include<iostream> #include<cstdio> #include<algorithm> using namespace ...

  7. LOJ P10011 愤怒的牛 题解

    每日一题 day36 打卡 Analysis 非常水的二分模板,就直接二分答案,用贪心策略check就好了 #include<iostream> #include<cstdio> ...

  8. bzoj1734 愤怒的牛

    Description Farmer John has built a new long barn, with N (2 <= N <= 100,000) stalls. The stal ...

  9. bzoj1734 [Usaco2005 feb]Aggressive cows 愤怒的牛

    Description Farmer John has built a new long barn, with N (2 <= N <= 100,000) stalls. The stal ...

随机推荐

  1. 【JDK】JDK源码分析-CountDownLatch

    概述 CountDownLatch 是并发包中的一个工具类,它的典型应用场景为:一个线程等待几个线程执行,待这几个线程结束后,该线程再继续执行. 简单起见,可以把它理解为一个倒数的计数器:初始值为线程 ...

  2. android ——多线程编程

    1.定义一个线程只需要新建一个类继承自Thread.然后重写run()方法,并在里面编写耗时逻辑即可: class MyThread extends Thread{ public void run() ...

  3. Linux文件及目录管理

    1.Linux文件目录树 /:根目录,linux文件系统的最顶端和入口 bin:存放用户二进制文件(如:ls,cd,mv等),实则/user/bin的硬链接(相当于Windows系统的快捷方式) bo ...

  4. .Net Core2.1 秒杀项目一步步实现CI/CD(Centos7.2)系列一:k8s高可用集群搭建总结以及部署API到k8s

    前言:本系列博客又更新了,是博主研究很长时间,亲自动手实践过后的心得,k8s集群是购买了5台阿里云服务器部署的,这个集群差不多搞了一周时间,关于k8s的知识点,我也是刚入门,这方面的知识建议参考博客园 ...

  5. Linux之各程序安装

    python安装 安装python3.6 安装python前的库环境,非常重要 yum install gcc patch libffi-devel python-devel zlib-devel b ...

  6. Linux配置及指令

    目录 Linux配置及指令 一.linux中常用软件的安装 二.主机名和网络 1.修改主机名 2.设置网络 三.关闭防火墙 1.检查防火墙是否开启 2.清除策略 3.永久关闭第一个防火墙 4.关闭第二 ...

  7. django 获取当前访问的URL

    next_url = request.path_info print(next_url) print(request.get_full_path()) //打印出全路径(路径和参数) print(re ...

  8. DNS主、从域名服务器配置

    #命令为红色 #vi编辑内容为蓝色 建立主.从或者缓存域名服务器,前提一定要关闭防火墙和linux防护机制,否则不能成功解析客户机请求 永久关闭防火墙和安全机制命令如下: systemctl stop ...

  9. 线程学习oneday

    进程:执行中的程序叫做进程(Process),是一个动态的概念. 线程:一个进程可以产生多个线程.同多个进程可以共享操作系统的某些资源一样,同一进程的多个线程也可以共享此进程的某些资源(比如:代码.数 ...

  10. 枚举类&&注解&&反射

    什么是枚举类? 枚举类是优化定义固定对象的一种特殊的类. 换句话说,在需要类的实例为一个或者多个并且相对固定的时候,使用枚举类.(枚举类可扩展) 类的实例相对来说固定的有日期,客观不变的一些数字等等. ...