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 }