码迷,mamicode.com
首页 > 其他好文 > 详细

二分答案经典入门题:)

时间:2019-02-13 10:57:38      阅读:258      评论:0      收藏:0      [点我收藏+]

标签:while   strong   之间   记录   problem   ++   int   using   注意   

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 }

 

二分答案经典入门题:)

标签:while   strong   之间   记录   problem   ++   int   using   注意   

原文地址:https://www.cnblogs.com/THWZF/p/10368508.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!