洛谷:P1024 一元三次方程求解
代码:
#include<iostream>
#include<stdio.h>
using namespace std;
double a,b,c,d;
int s=0;
double Count(double n)//判断函数,方便简洁。
{
return a*n*n*n+b*n*n+c*n+d;
}
int main()
{
cin>>a>>b>>c>>d;
for(double i=-100;i<100;i++)
{
double l=i;
double r=i+1;
if(Count(l)==0)//这是当答案是整数的时候,
{
printf("%.2lf ",l);
s++;
}
if(Count(r)*Count(l)<0)//这里是判断当函数是小数的时候。
{
while(r-l>=0.001)//这里一定要有等于号,这里也一定要是0.001,
//因为要保存2位小数,因此当差是3位小数的时候,就不需要判断了。
//这样写就保证了r与l的差值小数点第三位一直是0,
//因此在最后选结果的时候选r或l都行,因为小数点第三位都是小于4.不影响结果。
//所以以后这样的二分法,最后选取结果一定要想想怎么写判断循环结束,和怎么选取结果。
{
double mid=(r-l)/2+l;
// if(Count(mid)=0)
// {
// s++;
// printf("%.2lf ",mid);
// }
if(Count(mid)*Count(l)>0)
l=mid;
else
r=mid;
}
printf("%.2lf ",r);
s++;
}
if(s==3)
break;
}
return 0;
}
洛谷:P2678
**思路:**通过二分枚举最短距离,然后再最短距离里面找最大的距离。
代码:
//思路:通过二分枚举最短的距离,然后在这些最短的距离中通过二分推出最大的。
#include<iostream>
using namespace std;
typedef long long ll;
const int maxn=5e4+10;
int s[maxn],n,l,m;
bool judge(int x)
{
int sum=0,be=0,fe=0;
while(fe<n+1)//这里面是判断是否要去掉第fe块石头,因此是<,没有=
{
fe++;
if(s[fe]-s[be]<x)
sum++;
else
be=fe;
}
return sum<=m;
}
int main()
{
cin>>l>>n>>m;
for(int i=1;i<=n;i++)
cin>>s[i];
s[n+1]=l;
int le=1,ri=l;
while(ri>=le)//要有等于,
//解释:当到最后一个相邻的ri和le的时候如果没有等于就只判断了le,有了等于才会判断ri。
//因此要有等于。
//但是判断ri之后,(因为这是找最大的会向右边走),le会+1,因此最后输出le-1.
//以后求最大的时候都按照这样的模板写,①ri>=l1②最后结果是l--。
{
int mid=(ri-le)/2+le;
if(judge(mid))
le=mid+1;
else
ri=mid-1;
}
cout<<le-1;
return 0;
}