您的位置:首页 > 其它

【基本二分】HDU2199-精度控制求解

2012-11-06 12:45 330 查看
最近处于乱撞状态,看到哪算哪,当然以基础的模拟,搜索,字符串为主+少量的计算几何理论学习还有一堆比赛中用来签到的水题,因为确实不会了

瓶颈期ORZ..

这个题是二分思想的典范,一个left,一个right,一个middle为他们除2,数据是线性的,所以不用排序,多了的话就把尾部往前挪(tail=ans-极小),少的话把头部往后挪(head=ans+极小),直到(尾-头=极小)为止,这便是二分思想。

一个函数,精度控制4位,所以C++的话用iomanip,C的%lnf控制就有用了,精度差了一丁点,但还是AC了,可能是GCC版本的问题。

#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;

double f(double x)
{
	return 8*pow(x,4.0)+7*pow(x,3.0)+2*pow(x,2.0)+3*x+6;
}

int main()
{
	int testcase;
	cin>>testcase;
	for(int i=0;i<testcase;i++)
	{
		double y;
		
		cin>>y;
	
		if(f(0)>y || f(100)<y)
		{
			cout<<"No solution!"<<endl;
		}
		
		else
		{
			double head=0,tail=100;
			while(tail-head > 1e-6)
			{
				double middle=(head+tail)/2.0;
				double answer=f(middle);
				if(answer>y)
				{
					tail=middle-1e-7;
				}
				else
				{
					head=middle+1e-7;
				}
				
			}
			cout<<setiosflags(ios::fixed)<<setprecision(4)<<(tail+head)/2.0<<endl;
			
		}
		
		
		
		
	}
	
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: