LuoguP1024 一元三次方程求解
因为根与根之间的差不超过1,所以我们就可以分段枚举,又已知根的取值范围是[-100,100],于是就很简单啦QWQ
xiu~代码走起——
1 #include2 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;//两根之间差值不超过113 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>=l21 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 #include2 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 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块石头的距离才是l29 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 }