Java 该不等式的优化与计算

Java 该不等式的优化与计算,java,c,algorithm,Java,C,Algorithm,假设我有一组整数,我想从中找出满足某个不等式的最大整数数。为了解释, r1,r2,r3。。。当ri为正整数时为rn。我想找到从1到n的最大z值,对于这个值ri我感觉有点糟糕,特别是对于我对这个问题所做的错误编辑。。。无论如何: 第一,解决这个问题最天真、最直接、最直接的方法;这将是从集合中的第一个数字开始,计算每一步的nth部分和,将该部分和与从第三个元素开始直到nth元素的每个元素的两倍进行比较。如果对每个元素进行比较,则将当前最后一个标记为最大值z 以下宏largestzfinder,取决于

假设我有一组整数,我想从中找出满足某个不等式的最大整数数。为了解释,


r1,r2,r3。。。当ri为正整数时为rn。我想找到从1到n的最大z值,对于这个值ri我感觉有点糟糕,特别是对于我对这个问题所做的错误编辑。。。无论如何:

第一,解决这个问题最天真、最直接、最直接的方法;这将是从集合中的第一个数字开始,计算每一步的
n
th部分和,将该部分和与从第三个元素开始直到
n
th元素的每个元素的两倍进行比较。如果对每个元素进行比较,则将当前最后一个标记为最大值
z

以下宏
largestzfinder
,取决于函数
largestzfinderfunc
执行以下操作:

// indices are zero based

#define largestzfinder(_x_) largestzfinderfunc((_x_), sizeof(_x_) / sizeof(*_x_))

unsigned int largestzfinderfunc( unsigned int set[], size_t size ) {

    unsigned int largestz = 0;
    unsigned int partialsumsofar = 0;
    int disqualified;

    for ( int i = 0; i < size; i++ ){
        partialsumsofar += set[i];

        disqualified = 0;
        for ( int j = 2; j <= i; j++ ) {    // for all j from 2 to i (inclusive)
            if ( 2 * set[j] > partialsumsofar ) {
                disqualified = 1;
                break;
            }
        }

        if ( !disqualified )    // if comparison held for all j
            largestz = i;
    }

    return largestz;
}
// indices are zero based

#define largestzfinder(_x_) largestzfinderfunc((_x_), sizeof(_x_) / sizeof(*_x_))

unsigned int largestzfinderfunc( unsigned int set[], size_t size ) {

    unsigned int largestz = 0;
    unsigned int partialsumsofar = 0;
    int disqualified;

    for ( int i = 0; i < size; i++ )
        partialsumsofar += set[i];

    for ( int i = size - 1; i >= 0; i-- ){

        disqualified = 0;
        for ( int j = 2; j <= i; j++ ) {    // for all j from 2 to i (inclusive)
            if ( 2 * set[j] > partialsumsofar ) {
                disqualified = 1;
                break;
            }
        }

        if ( !disqualified ) {  // if comparison held for all j
            largestz = i;
            break;
        }

        partialsumsofar -= set[i];  // updates/reduces partialsumsofar
    }

    return largestz;
}
现在,你看,我们逐个检查从第三个元素到最后一个元素的条件是否成立。。。而我们可以检查其中最大的一个!如果<代码>最大,则为最大[i-1])?集合[i]:最大的集合[i-1]; 对于(int i=size-1;i>=0;i--){ 如果(2*largestsofar[i]largestsofar)?设置[i+1]:largestsofar))){ 返回j; }
否则,如果(2*largestofar)的值能为负值吗?@OliCharlesworth,除非我计算错误,如果
rn>0
对于所有
n
,那么任何
z>=2
都将满足条件,因此在{1,2,3}的情况下,最大
z
将是
n
No@ThoAppelsin不适用于大于等于三的任何这样的子集,等式不成立。@ ThoAppelsin:考虑R= { 8, 1, 1 }。Z= n不是这里的情况(R1> 0.5*(8 + 1 +1))。那么,你想用一组像<代码> {8, 1, 1 }的答案是什么?其中没有
z
满足条件?是否存在类似
r\n
的条件作为递增集?
// indices are zero based

#define largestzfinder(_x_) largestzfinderfunc((_x_), sizeof(_x_) / sizeof(*_x_))

unsigned int largestzfinderfunc( unsigned int set[], size_t size ) {

    unsigned int largestz = 0;
    unsigned int partialsumsofar = 0;
    unsigned int * largestsofar = calloc( size, sizeof * largestsofar );

    for ( int i = 0; i < size; i++ )
        partialsumsofar += set[i];

    largestsofar[0] = 0;
    largestsofar[1] = 0;
    largestsofar[2] = set[2];
    for ( int i = 3; i < size; i++ )
        largestsofar[i] = (set[i] > largestsofar[i-1]) ? set[i] : largestsofar[i-1];

    for ( int i = size - 1; i >= 0; i-- ){

        if ( 2 * largestsofar[i] <= partialsumsofar ) {
            largestz = i;
            break;
        }

        partialsumsofar -= set[i];
    }

    free( largestsofar );

    return largestz;
}
// indices are zero based

#define largestzfinder(_x_) largestzfinderfunc((_x_), sizeof(_x_) / sizeof(*_x_), (_x_)[0] + (_x_)[1], 1, 0)

unsigned int largestzfinderfunc( unsigned int set[], size_t size, unsigned int partialsumsofar, unsigned int i, unsigned int largestsofar ){
    unsigned int j;
    if ( i < size - 1 && ( j = largestzfinderfunc( set, size, partialsumsofar + set[i + 1], i + 1, ( set[i + 1] > largestsofar ) ? set[i + 1] : largestsofar ) ) ){
        return j;
    }
    else if ( 2 * largestsofar <= partialsumsofar ) {
        return i;
    }
    else
        return 0;
}