所以,我正在解决这个问题:http://www.spoj.com/problems/immersed/
一个奇妙的发现即将在生物学领域发生,你是进行研究的团队的一员。这项研究是关于测量细胞在无氧和有毒物质存在的环境中的生长。研究小组得出了一个精确的假设,分析的数据告诉他们:生长、天数和毒性;由以下公式关联:
P=n*ncn;
第一行是T(1≤T≤400000),测试用例的数量,然后是T个测试用例。
每个测试用例都是一条用空格分隔的2个整数(P,c)的线。
P(1≤P≤1015)
#define eps 1e-7
const double cont = 14.0;
double p,c;
double binary (double start, double end);
double func (double n);
int main (void)
{
int t;
cin>>t;
while (t != 0)
{
cin>>p>>c;
double mid,ans,start=0,end=cont;
ans = binary(start,end);
cout.precision(6);
cout<<fixed<<ans<<"\n";
t--;
}
return 0;
}
double func (double n)
{
double ret = n*pow(n,c*n);
return ret;
}
double binary (double start, double end)
{
if (start <= end)
{
double mid = start + (end-start)/2.0;
if (func(mid)-p <= eps)
return mid;
else if (func(mid)-p > eps)
return binary(start,mid);
else
return binary(mid,end);
}
}
Input:
3
1 1
3 4
100 1
Output:
1.000000
1.207384
3.086308
My output (for the above input)
0.875
0.875
1.75
PS:我没有张贴库和所有,以避免杂乱。此外,我将设置为小数点后6位,一旦我得到正确的值。我只想知道,是我的逻辑不正确还是我的二分搜索被错误地实现了?
编辑:我提交的新代码
double binary (double start, double end)
{
if (start <= end)
{
double mid = start + (end-start)/2.0;
double delta = func(mid) - p;
if (delta < -1*eps)
return binary(mid,end);
else if (delta > eps)
return binary(start,mid);
else
return mid;
}
}
您正在以不合理的顺序进行测试:
if (func(mid)-p <= eps)
return mid;
else if (func(mid)-p > eps)
return binary(start,mid);
else
return binary(mid,end);
试试看
if (func(mid)-p < -eps)
return binary(mid,end);
else if (func(mid)-p > eps)
return binary(start,mid);
else
return mid;
我也不确定这两个递归调用。我保留了你的逻辑,哪种情况下叫哪种(因为我可能误解了你的公式),但他们回头看我。
double binary (double start, double end)
{
for (;;)
{
double mid = (start + end) * .5;
double delta=func(mid)-p;
if ( delta < -eps)
start = mid;
else if (delta > eps)
end = mid;
else
return mid;
}
}
代码是一个简单的二分搜索程序。我试着追踪程序,但它只会让我更加困惑。我不明白为什么嵌套的if has data,min,midpoint-1,&target和底部的else if语句has data,midpoint+1,max,target。
我一直在尝试使用Java的二分搜索方法在单词数组(一个词典)中搜索一个特定的字符串,然后确定该字符串是单词、前缀还是不是单词。如果返回的索引大于或等于零,则字符串为单词。如果返回的索引小于零,那么我必须确定它不是一个单词,还是一个前缀。
我写了一个二分搜索的递归程序,正如你所看到的,我试图在给定的数组中找到目标=21的位置,然后返回位置为2。但是,我的输出是1。当我调试它匹配att arr[start]=target时,它直接跳到findTheNumber(arr,mid+1,end,target)行;然后下一行,然后返回mid..只是想知道为什么我的返回在“返回开始”时中断了 }
我在写一个程序,你可以输入一个单词,它将被存储在一个数组列表中。然后,您可以通过在文本字段中输入这些词并按下按钮来搜索这些词。(如果按下另一个按钮,也可以对它们进行排序)。如果找到了这个词,就应该打印出这个词在ArrayList中的位置,如果找不到,就应该打印出来。直到最近我测试它的时候,我一直认为这是可行的(以前也是可行的):我输入了一个我知道在ArrayList中的单词,这样它就可以打印出这个
主要内容:src/runoob/binary/BinarySearch.java 文件代码:一、概念及其介绍 二分搜索树(英语:Binary Search Tree),也称为 二叉查找树 、二叉搜索树 、有序二叉树或排序二叉树。满足以下几个条件: 若它的左子树不为空,左子树上所有节点的值都小于它的根节点。 若它的右子树不为空,右子树上所有的节点的值都大于它的根节点。 它的左、右子树也都是二分搜索树。 如下图所示: 二、适用说明 二分搜索树有着高效的插入、删除、查询操作。 平均时间的时间复
主要内容:src/runoob/binary/LevelTraverse.java 文件代码:二分搜索树的层序遍历,即逐层进行遍历,即将每层的节点存在队列当中,然后进行出队(取出节点)和入队(存入下一层的节点)的操作,以此达到遍历的目的。 通过引入一个队列来支撑层序遍历: 如果根节点为空,无可遍历; 如果根节点不为空: 先将根节点入队; 只要队列不为空: 出队队首节点,并遍历; 如果队首节点有左孩子,将左孩子入队; 如果队首节点有右孩子,将右孩子入队; 下面依次演示如下步骤: (1)先取出