用二分法的常见题型:
二分搜索
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<stdlib.h>
#include<string.h>
#include<string>
#include<math.h>
using namespacestd;
int v;
int a[1000];
/*intbsearch(int x,int y)
{
int m;
while(x<y)
{
m=x+(y-x)/2;
if(v==a[m]) return m;
if(v<a[m])
y=m;
else
x=m+1;
}
return -1;
}
*/
//如果存在相同的数,怎么找上下界
//上界
/*
int bsearch(intx,int y)
{
int m;
while(x<y)
{
m=x+(y-x)/2;
if(v<a[m])
y=m;
else
x=m+1;
}
return x;
}
下界
*/
/*
int bsearch(intx,int y)
{
int m;
while(x<y)
{
m=x+(y-x)/2;
if(v<=a[m])
y=m;
else
x=m+1;
}
return x;
}
*/
int main()
{
int n,i;
cin>>n>>v;
for(i=0;i<n;++i) cin>>a[i];
sort(a,a+n);
int ans=bsearch(0,n);
// cout<<*lower_bound(a,a+n,v)<<endl;
// cout<<*upper_bound(a,a+n,v)<<endl;
cout<<ans<<endl;
return 0;
}
二分法非线性方程求根
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<stdlib.h>
#include<string.h>
#include<string>
#include<math.h>
using namespacestd;
int main()
{
double a,b,c,f;
while(cin>>a>>b>>c)
{
double x=0,y=100;
while(y-x>1e-5)
{
double m=x+(y-x)/2.0;
double f=a;
for(int i=0;i<4;++i)
f+=f*m/100.0-c;
if(f>=0) //相当于找下界
y=m;
else
x=m;
}
printf("%.3lf\n",x);
}
return 0;
}
二分最大值最小化
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<stdlib.h>
#include<string.h>
#include<string>
#include<math.h>
using namespacestd;
int a[1000005];
int n,k;
int judge(int m)
{
int i,sum,count=1;
sum=a[0];
for(i=1; i<n; ++i)
{
if(sum+a[i]>m)
{
sum=a[i];
count++;
continue;
}
sum+=a[i];
}
if(count<=k)
return 1;
else
return 0;
}
int main()
{
freopen("C:/data.in","r", stdin);
freopen("C:/data.out","w", stdout);
int t=100;
while(t--)
{
int i;
cin>>n>>k;
for(i=0; i<n; ++i)
{
cin>>a[i];
}
int x=0,y=100;
while(x<y)
{
int m=x+(y-x)/2;
if(judge(m))
y=m;
else
x=m+1;
}
cout<<x<<endl;
}
return 0;
}