二分答案经典入门题:)
LuoguP1024 一元三次方程求解
因为根与根之间的差不超过1,所以我们就可以分段枚举,又已知根的取值范围是[-100,100],于是就很简单啦QWQ
xiu~代码走起——
1 #include<cstdio> 2 double a,b,c,d; 3 double count(double x){//计算函数值 4 return a*x*x*x+b*x*x+c*x+d; 5 } 6 int main(){ 7 double l,r,mid,x1,x2; 8 int tot=0,i; 9 scanf("%lf%lf%lf%lf",&a,&b,&c,&d); 10 for (i=-100;i<100;i++){ 11 l=i; 12 r=i+1;//两根之间差值不超过1 13 x1=count(l); 14 x2=count(r); 15 if(x1==0){ 16 printf("%.2lf ",l); 17 tot++;//记录根的数量,总共3个 18 } 19 if(x1*x2<0){ 20 while(r-l>=0.001){//实数比较,相当于r>=l 21 mid=(l+r)/2; 22 if(count(mid)*count(r)<=0) 23 l=mid; 24 else 25 r=mid; 26 } 27 printf("%.2lf ",r); 28 tot++; 29 } 30 if (tot==3) 31 break; 32 } 33 return 0; 34 }
LuoguP2678 跳石头
一看到求最小的最大就知道这是二分答案经典题。
直接二分枚举答案也就是最短跳跃距离,然后判断需要挪走的石头数量是否合法,恩就酱紫直接上代码吧
1 #include<bits/stdc++.h> 2 using namespace std; 3 int l,n,m,d[50002]; 4 int fr(){ 5 int w=0,q=1; 6 char ch=getchar(); 7 while((ch<'0'||ch>'9')&&ch!='-') ch=getchar(); 8 if(ch=='-') q=-1; 9 while(ch<='9'&&ch>='0') w=w*10+ch-'0',ch=getchar(); 10 return w*q; 11 } 12 int maxn=0; 13 bool pd(int x){ 14 int now=0,num=0,next=0; 15 while(next<n+1){ 16 next++; 17 if(d[next]-d[now]<x) 18 num++; 19 else now=next; 20 } 21 if(num>m) return 0;//需要移走的石头数量>最多可以移走的石头数量则显然不合法 22 else return 1; 23 } 24 int main(){ 25 l=fr();n=fr();m=fr(); 26 for(int i=1;i<=n;i++) 27 d[i]=fr(); 28 d[n+1]=l;//注意第n+1块石头的距离才是l 29 int L=1,R=l;//注意一下左右端点的初始值,要符合题目的要求 30 while(L<=R){ 31 int mid=(L+R)/2; 32 if(pd(mid)){ 33 L=mid+1; 34 maxn=mid;//记录最大的答案 35 } 36 else R=mid-1; 37 } 38 printf("%d",maxn); 39 return 0; 40 }
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· DeepSeek火爆全网,官网宕机?本地部署一个随便玩「LLM探索」
· 开发者新选择:用DeepSeek实现Cursor级智能编程的免费方案
· 【译】.NET 升级助手现在支持升级到集中式包管理
· 独立开发经验谈:如何通过 Docker 让潜在客户快速体验你的系统
· Tinyfox 发生重大改版