代码无法找到最大总和

时间:2018-01-08 17:46:35

标签: c

Link to CodeChef problem MAXSC

尝试解决方案:

    swal({
     title:"Enter a Username",
     content: {
                element: "input",
                attributes: {
                    placeholder: "Type your username",
                    type: "text"
                     },
             },


    className: "mySwal"
    }).then((username)=>{
            //get the username
            if(username){

            }else{


            }

});

计算E1 + E2 + ... + EN的最大可能值。如果不能选择元素E1,E2,...,EN,则改为打印-1。

约束:
代码应该选择N个元素,每个序列一个; let表示由E i 从序列A i 中挑选的元素。对于每个i(2≤i≤N),E i 应严格大于E i-1

这个约束是否意味着我们必须从每一行中选择最大元素?

如果你看一下给出的例子:

示例输入:

#include<stdio.h>

int main()
{
    long long int n, t, k, i, j, max[701], a[701][701], sum, flag;

    scanf( "%lld", &t );

    for( k = 0 ; k < t ; k++ )
    { 
        scanf( "%lld", &n );

        for( i = 1 ; i <= n ; i++ )
        {  
            for( j = 1 ; j <= n ; j++ )
            { 
                scanf( "%lld", &a[i][j] );
                if( j == 1)
                    max[i] = a[i][1];
                if( a[i][j] > max[i] )
                    max[i] = a[i][j];
            }
        }

        sum = 0, flag = 0;

        for( i = 1 ; i <= n-1 ; i++ )
        { 
            if( max[i] &lt; max[i+1])
                sum = sum + max[i];
            else
            {
                flag = 1;
                break;
            }
        }

        if(flag == 1)
            printf("-1\n");
        else
        {
            sum = sum + max[n-1];
            printf("%lld\n", sum );
        }
    }
}

输出:

1
3
1 2 3
4 5 6
7 8 9

解释

示例案例1:要最大化得分,请从第一行选择3,从第二行选择6,从第三行选择9。得到的和为E1 + E2 + E3 = 3 + 6 + 9 = 18。

如果您发现他们已经提及&#34;最大化&#34;。

虽然我的代码找到了最大值,但它并没有被接受。

3 个答案:

答案 0 :(得分:2)

  

为什么不接受此代码?

代码的逻辑是有缺陷的。如果max[i] < max[i+1]为false,则会设置flag = 1;,而不是考虑a[i]中的其他元素。

  

这个约束是否意味着我们必须从每一行中选择最大元素?

没有。目标是最大总和,而不是最大值之和。

// if( max[i] &lt; max[i+1])
if(max[i] < max[i+1])
  sum = sum + max[i];
else {
  flag = 1;
  break;
}

解决方案在于绑定其他元素。即使失败了,也许应该改变先前的选择。可以采用递归或其他分析。我认为首先对每行数据进行排序以避免此代码运行n*n运行时是有意义的。编写n*n解决方案(尝试每种组合)应该是微不足道的。

由于这是作业,请留给OP来开发解决方案。

答案 1 :(得分:0)

1

3

6 10 12

4 5 7

8 9 10

-1

但输出应为6 + 7 + 10 = 23。

问题是Ei应该严格大于Ei-1

答案 2 :(得分:0)

1
3
1 2 3
4 5 6
7 8 9  

输出为3 + 6 + 9 = 18表示3&lt; 6和6 <9,满足上述问题

3
6 10 12
4 5 7
8 9 10

输出是6 + 7 + 10 = 23意味着12 <7这是假的而6 <7这是真的而7 <10也是真的所以总和= 23.

3
8 9 10
11 12 13
10 5 9

输出为-1,因为10 <13为真但13不小于10或5或9为假,因此输出为-1。