# hdu-2199、hdu2899、hdu2141、hdu2289二分，牛顿迭代

hdu2199

(警示，一定要论证后，再确定是不是超时。确定思路不会超内存，超时后再去写代码，省去无谓的时间)

#include <iostream>
#include<stdio.h>
using namespace std;
#define INF 0.000001
#define MIN 0.0000001
double m;
double fun(double x)
{
return 8*x*x*x*x+7*x*x*x+2*x*x+3*x+6;
}
int main()
{
int n;
cin>>n;
while(n--)
{
cin>>m;
double first=0;double end=100;
double mid;
if(fun(0)>m||fun(100)<m)
cout<<"No solution!"<<endl;
else
{
while(end-first>INF)
{
mid=(first+end)/2.0;
if(fun(mid)>m) {end=mid+MIN;}
else if(fun(mid)<m) {first=mid-MIN;}
}
printf("%.4lf\n",(first+mid)/2.0);
}
}
return 0;
}

#include<iostream>
#include<cmath>
#include<stdio.h>
using namespace std;
#define INF 0.000001
#define MIN 0.0000001
double x;
double iteration(double m)
{
while(abs(8*x*x*x*x+7*x*x*x+2*x*x+6-m)>INF)//迭代过程控制
{
x-=(8*x*x*x*x+7*x*x*x+2*x*x+6-m)/(32*x*x*x+21*x*x+4*x+3);//迭代关系式
}
return x;//迭代变量
}
int main()
{
int n;
cin>>n;
while(n--)
{
double m;
cin>>m;
x=100.0;
if(8*x*x*x*x+7*x*x*x+2*x*x+6<m){cout<<"No solution!"<<endl;continue;}
else if(6.0>m){cout<<"No solution!"<<endl;continue;}
iteration(m);
if(x-0<MIN) cout<<"No solution!"<<endl;
else printf("%.4lf\n",x);
}
}

hdu 2899

F'(x)=0时，函数有最小值。所以只需要 求解F‘(x)=0,把x带入即可。

//6 * x^7+8*x^6+7*x^3+5*x^2-y*x
#include <iostream>
#include<stdio.h>
using namespace std;
#define INF 0.0000001
#define MIN 0.00000001
double m;
double res(double x)
{
return 6*x*x*x*x*x*x*x+8*x*x*x*x*x*x+7*x*x*x+5*x*x-x*m;
}
double fun(double x)
{
return 42*x*x*x*x*x*x+48*x*x*x*x*x+21*x*x+10*x;
}
int main()
{
int n;
cin>>n;
while(n--)
{
cin>>m;
double first=0;double end=100;
double mid;
while(end-first>INF)
{
mid=(first+end)/2.0;
if(fun(mid)>m) {end=mid+MIN;}
else if(fun(mid)<m) {first=mid-MIN;}
}
printf("%.4lf\n",res((first+mid)/2.0));
}
return 0;
}

hdu2141 Can you find it?

#include<iostream>
#include <algorithm>
using namespace std;
int A[505];
int B[505];
int C[505];
int sum[250005];
int l,m,n;
bool search(int x)
{
int first=0;int end=l*n;
int mid;
while(first<=end)
{
mid=(first+end)/2;
if(x<sum[mid]) end=mid-1;
else if(x==sum[mid]) return true;
else first=mid+1;
}
return false;
}
int main()
{
int i,j,s;int X;
int cnt=1;
while(~scanf("%d%d%d",&l,&n,&m))
{
printf("Case %d:\n",cnt++);
for(i=0;i<l;i++)
scanf("%d",&A[i]);
int k=0;
for(i=0;i<n;i++)
{
scanf("%d",&B[i]);
for(j=0;j<l;j++)
sum[k++]=A[j]+B[i];
}
sort(sum,sum+l*n);
for(i=0;i<m;i++)
scanf("%d",&C[i]);
cin>>s;
for(i=0;i<s;i++)
{
int flag=0;
scanf("%d",&X);
for(j=0;j<m;j++)
{
flag = search( X - C[j]);
if(flag) break;
}
if(flag) printf("YES\n");
else printf("NO\n");
}
}
return 0;
}

hdu2289 Cup

#include <iostream>
#include<stdio.h>
#include<cmath>
using namespace std;
#define INF 0.00000001
const double PI  = acos(-1.0);
double R,r,H,V;
double fun(double h)
{
double a=h*(R-r)/H+r;
return PI*(r*r+r*a+a*a)*h/3.0;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%lf%lf%lf%lf",&r,&R,&H,&V);
double first=0;double end=H;
double mid=0;
while((end-first)>INF)
{
mid=(first+end)/2.0;
double res=fun(mid);
if(res>V) end=mid+0.000000001;
else if(fabs(res-V)<INF) break;
else first=mid-0.000000001;
}
printf("%.6lf\n",mid);
}
return 0;
}


• 本文已收录于以下专栏：

## hdu 2199Can you solve this equation?（牛顿迭代法）

#include #include #include #define f(x) 8*x*x*x*x+7*x*x*x+2*x*x+3*x+6-y //f(x)= 0;f1(x)=f(x)';即...

## HDU 2199 Can you solve this equation?(牛顿迭代法)

【链接】：click here~~ 【描述】： Now,given the equation 8*x^4 + 7*x^3 + 2*x^2 + 3*x + 6 == Y,can you find i...

举报原因： 您举报文章：深度学习：神经网络中的前向传播和反向传播算法推导 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)