题解 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 ...
随机推荐
- 转载:MyBatis mapper.xml中使用静态常量或者静态方法
转自:https://my.oschina.net/wtslh/blog/682704 今天偶然之间刷到了这样一篇博客,有点意外 mybatis 还可以这样使用ONGL常量的方式,该方式针对 xml的 ...
- 【Java例题】8.1手工编写加法器的可视化程序
1. 手工编写加法器的可视化程序. 一个Frame窗体容器,布局为null,三个TextField组件,一个Button组件. Button组件上添加ActionEvent事件监听器ActionLis ...
- vue-cli中的跨域之proxytable
为什么会有跨域? 浏览器有一个叫做同源策略的东西.同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互.这是一个用于隔离潜在恶意文件的重要安全机制. 同源策略规定了如果两个页面的协 ...
- 完整原型链详细图解之JS构造函数、原型 原型链、实例化对象
一.首先说一下什么是构造函数: 构造函数:用来在创建对象时初始化对象.特点:构造函数名一般为大写字母开头:与new运算符一起使用来实例化对象. 举例: function Person(){} //Pe ...
- 常量Const
常量Const YEAR = 2019 # 全部大写的变量名为常量 注释 给不能理解的写一个描述 便于理解 增强可读性 三种形式 单行(当行)注释:# 只注释一行 不能换行 注释的代码不执行 不使用 ...
- mybatis 源码分析(一)框架结构概览
本篇博客将主要对 mybatis 整体介绍,包括 mybatis 的项目结构,执行的主要流程,初始化流程,API 等各模块进行简单的串联,让你能够对 mybatis 有一个整体的把握.另外在 myba ...
- 深入理解JVM虚拟机开篇:JVM介绍与知识脉络梳理
微信公众号[Java技术江湖]一位阿里 Java 工程师的技术小站.作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux.网络.多线程,偶尔 ...
- 轻松pick移动开发第一篇,flex布局
一.什么是flex布局 首先提问一个问题,一般童鞋都会让子元素水平居中,那么怎么让子元素垂直居中呢?这里就要用到我们的flex布局了. 1.flex 是 flexible Box 的缩写,意为&quo ...
- Keras实例教程(2)
https://blog.csdn.net/baimafujinji/article/details/78385745
- JVM内存机制与垃圾收集器总结
本文目录 1. JVM内存组成结构 2. JVM内存回收 3. 垃圾收集器与算法 4. jdk1.6中class文件结构 5. jdk1.6 1.7 1.8比较 1. JVM内存组成结构 JVM栈由堆 ...