zoukankan      html  css  js  c++  java
  • 二分答案经典入门题:)

    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 }
  • 相关阅读:
    HTML+JSP的登录界面数据库链接
    链式前向星模板
    【洛谷【模板】最小生成树】
    【洛谷P1090 合并果子】
    Dijkstra【迪杰斯特拉算法】
    Bellman-Ford&&SPFA
    【一本通1248:Dungeon Master&&洛谷UVA532 Dungeon Master】
    【一本通1329:【例8.2】细胞&&洛谷P1451 求细胞数量】
    Floyed-Warshall【弗洛伊德算法】
    广搜
  • 原文地址:https://www.cnblogs.com/THWZF/p/10368508.html
Copyright © 2011-2022 走看看