原帖由 woxinfeixiang 于 2006-1-17 16:13 发表
和当前值比较的时候,是每乘以一个数就比较一次吗~~~最好给出一个算式。脑袋笨转不过来!~
等待指教!
原帖由 dbcat 于 2006-1-16 00:52 发表
题目如下:
令 X(1), X(2),X(3), X(4) 。。。X(n)是一串实数(不需要一定为正数)。
设计一个O(n)的算法,寻找一个(连续的)子序列X(i),X(i+1)。。。X(j),使得它
们的乘积在所有 ...
原帖由 emacsnw 于 2006-1-18 04:33 发表
[code]
#include <stdio.h>
double maxprod(double x[],int n)
{
int i;
double best = 1,worst = ...
复制代码
- #include <stdio.h>
- double maxprod(double x[],int n)
- {
- int i;
- double best = 1,worst = 1,bcurrent = 1,wcurrent = 1,t;
- for(i = 0;i<n;++i){
- bcurrent *= x[i];
- wcurrent *= x[i];
- if(bcurrent>best) best = bcurrent;
- if(wcurrent>best) best = wcurrent;
- if(bcurrent<worst) worst = bcurrent;
- if(wcurrent<worst) worst = wcurrent;
- if(wcurrent>bcurrent)
- t = bcurrent,bcurrent = wcurrent,wcurrent = t;
- if(bcurrent<1) bcurrent = 1;
- if(wcurrent>1) wcurrent = 1;
- }
- return best;
- }
- int main()
- {
- int n,i;
- double x[100];
- scanf("%d",&n);
- for(i = 0;i<n;++i) scanf("%lf",&x[i]);
- printf("%lf\n",maxprod(x,n));
- }
cc 1.c
./a.out
4
2.0 -2.0 2.0 2.0
1.00000
原帖由 win_hate 于 2006-1-16 18:34 发表
上面说错了,负数的情况比较复杂,因为含有偶数个负数的串乘积仍是正的。
修改方案为:求绝对值的乘积,并用一个变量记录当前乘积的符号,若负则不更新最大值。即前面的 s=s*x_i 改为 s=s*|x_i|.
原帖由 win_hate 于 2006-1-17 18:26 发表
能说一下思路吗? :D 谢谢.
我测了一下:
原帖由 yzc2002 于 2006-1-17 20:33 发表
emacsnw的和我的程序都有问题
5
-0.01 2 -4 3 -0.5
原帖由 emacsnw 于 2006-1-18 13:27 发表
我的程序返回12.0 (2*-4*3*-0.5),不知道应该是多少?
double
max_subsequence_mul( double a[], unsigned int n, int *begin, int *end )
{
double this_mul, max_mul;
int best_i, best_j, i = 0, j;
this_mul = max_mul = 1; best_i = best_j = -1;
double max;
int pos_i, pos_j, pos_start = 0;
double pos_mul, max_pos;
pos_mul = max_pos = 1; pos_i = pos_j = -1;
for( j=0; j<n; j++ )
{
pos_mul *= a[j];
if( pos_mul > max_pos)
{
max_pos = pos_mul;
pos_i = pos_start;
pos_j = j;
}
else if(pos_mul < 1)
{
pos_start = j + 1;
pos_mul = 1;
}
this_mul *= a[j];
if( this_mul > max_mul )
{
max_mul = this_mul;
best_i = i;
best_j = j;
}
else if( fabs(this_mul) < 1)
{
i = j + 1;
this_mul = 1;
}
}
if(max_pos > max_mul)
{
*begin = pos_i;
*end = pos_j;
max = max_pos;
}
else
{
*begin = best_i;
*end = best_j;
max = max_mul;
}
return( max );
}
原帖由 emacsnw 于 2006-1-18 04:33 发表
[code]
#include <stdio.h>
double maxprod(double x[],int n)
{
int i;
double best = 1,worst = ...
原帖由 yzc2002 于 2006-1-18 00:54 发表
我的那个算法是错的,我知道问题在哪,但不想改下去了,因为意义不大~~~
emacsnw是基于如下的想法:
设有队列x_1, x_2, ... x_i, 其中到x_i为止的连续积中,最大的为bcurrent(>0), 最小的为wcurrent(主要要 ...
原帖由 r2007 于 2006-1-18 02:35 发表
没有环境实际测试,不过通过推理,emacsnw的代码是经得起推敲的。
BTW: if(wcurrent>1) wcurrent = 1;这行应该可以省略。
如下
[code]double maxprod(double x[],int n)
{
int i;
double best = ...
原帖由 emacsnw 于 2006-1-19 14:41 发表
这位兄弟说的对,上次因为有点事情急着走了,贴了代码没来得及仔细解释一下。btw,我这段小程序能够通过上面几位的数据测试。
这个问题其实可以简化成这样:数组中找一个子序列,使得它的乘积最大;同时找 ...
原帖由 win_hate 于 2006-1-19 00:11 发表
r2002 给出的数据:
-0.01 5 -4 3
这个用你的代码算出 5, 实际应该是 6
原帖由 emacsnw 于 2006-1-19 14:41 发表
这位兄弟说的对,上次因为有点事情急着走了,贴了代码没来得及仔细解释一下。btw,我这段小程序能够通过上面几位的数据测试。
这个问题其实可以简化成这样:数组中找一个子序列,使得它的乘积最大;同时 ...
欢迎光临 Chinaunix (http://bbs.chinaunix.net/) | Powered by Discuz! X3.2 |