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] < 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;。
虽然我的代码找到了最大值,但它并没有被接受。
答案 0 :(得分:2)
为什么不接受此代码?
代码的逻辑是有缺陷的。如果max[i] < max[i+1]
为false,则会设置flag = 1;
,而不是考虑a[i]
中的其他元素。
这个约束是否意味着我们必须从每一行中选择最大元素?
没有。目标是最大总和,而不是最大值之和。
// if( max[i] < 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。