题解 yzoj1663: 愤怒的牛(二分) yzoj1662: 曲线(三分)
话说二分和三分的题还没有整理过,就趁这两题来整理下笔记
先讲讲关于二分,对于二分的具体边界长期以来对我来说都是个玄学问题,都是边调边拍改对的。思路大体是确定左边界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: 曲线(三分)的更多相关文章
- bzoj1734  [Usaco2005 feb]Aggressive cows 愤怒的牛 二分答案
		
[Usaco2005 feb]Aggressive cows 愤怒的牛 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 407 Solved: 325[S ...
 - BZOJ 1734: [Usaco2005 feb]Aggressive cows 愤怒的牛( 二分答案 )
		
最小最大...又是经典的二分答案做法.. -------------------------------------------------------------------------- #inc ...
 - B1734 [Usaco2005 feb]Aggressive cows 愤怒的牛 二分答案
		
水题,20分钟AC,最大值最小,一看就是二分答案... 代码: Description Farmer John has built a <= N <= ,) stalls. The sta ...
 - 1734: [Usaco2005 feb]Aggressive cows 愤怒的牛
		
1734: [Usaco2005 feb]Aggressive cows 愤怒的牛 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 217 Solved: ...
 - bzoj 1734: [Usaco2005 feb]Aggressive cows 愤怒的牛
		
1734: [Usaco2005 feb]Aggressive cows 愤怒的牛 Description Farmer John has built a new long barn, with N ...
 - bzoj 1734: [Usaco2005 feb]Aggressive cows 愤怒的牛【二分+贪心】
		
二分答案,贪心判定 #include<iostream> #include<cstdio> #include<algorithm> using namespace ...
 - LOJ P10011 愤怒的牛 题解
		
每日一题 day36 打卡 Analysis 非常水的二分模板,就直接二分答案,用贪心策略check就好了 #include<iostream> #include<cstdio> ...
 - bzoj1734 愤怒的牛
		
Description Farmer John has built a new long barn, with N (2 <= N <= 100,000) stalls. The stal ...
 - bzoj1734 [Usaco2005 feb]Aggressive cows 愤怒的牛
		
Description Farmer John has built a new long barn, with N (2 <= N <= 100,000) stalls. The stal ...
 
随机推荐
- Java NIO学习系列七:Path、Files、AsynchronousFileChannel
			
相对于标准Java IO中通过File来指向文件和目录,Java NIO中提供了更丰富的类来支持对文件和目录的操作,不仅仅支持更多操作,还支持诸如异步读写等特性,本文我们就来学习一些Java NIO提 ...
 - Office2019 VOL版本 自定义安装组件
			
众所周知,Office VOL版本可以连接KMS服务器激活,但是office2019没有镜像可以下载,所以只能依靠Office Deployment Tool来进行操作.注:Office2019 Re ...
 - git bash 初始化配置
			
这里只针对 windows 下,使用git 时的一些初始配置 1. git bash 安装 下载地址: https://git-for-windows.github.io/ 根据提示,一步步安装即可 ...
 - JAVA基础知识(二):List接口、ArrayList类和LinkedList类
			
List接口继承了Collection接口,位于java.util包中.它包含Collection接口的所有方法,外加其他一些方法(具体实现参考源码),比较重要的有: anyType get(int ...
 - Go中的文件读写
			
在 Go 语言中,文件使用指向 os.File 类型的指针来表示的,也叫做文件句柄 .我们来看一下os包的使用方式. 1.读取文件 os包提供了两种打开文件的方法: Open(name string) ...
 - 跟着大彬读源码 - Redis 10 - 对象编码之整数集合
			
[TOC] 整数集合是 Redis 集合键的底层实现之一.当一个集合只包含整数值元素,并且元素数量不多时,Redis 就会使用整数集合作为集合键的底层实现. 1 整数集合的实现 整数集合是 Redis ...
 - 上手mongodb
			
上手MongoDB MongoDB 是一个跨平台的,面向文档的数据库,如果你了解spring-data-jpa的使用, 那么恭喜你,你已经可以使用mongodb做开发了 使用这种类型的数据库还是挺方便 ...
 - android ——滑动菜单
			
一.DrawerLayout是一个拥有两个子控件的布局,第一个子控件是主屏幕中显示的内容,第二个子控件是滑动菜单中显示的内容: <android.support.v4.widget.Drawer ...
 - Opengl_入门学习分享和记录_01_Graphics Pipeline(图形渲染管线)
			
写在前面的废话: 这个系列拖更了很久,很大一定程度上是由于自己最近忙着高数学习和线代学习..感觉时间特别紧缺(其实就是我太懒了)好了不废话了,总结开始. 正文开始: 首先Graphics Pipeli ...
 - 关于JSP页面的静态包含和动态包含
			
JSP中有两种包含:静态包含:<%@include file="被包含页面"%> 和 动态包含:<jsp:include page="被包含页面&quo ...