1003 郁闷了一下午的题

本文提供了一种解决最大子数组和问题的C语言实现方案,特别关注了数组元素全部为负数的情况,并通过示例代码展示了如何找到具有最大和的连续子数组及其起始和结束位置。

看题不仔细,没考虑所有数字都可能小于0的情况,都被DS书上的例子给影响了。

 

#include <stdio.h>
#include 
<string.h>
#include 
<stdlib.h>

int res[110000];
int main()
ExpandedBlockStart.gifContractedBlock.gif
{
    
int cnt, n;
    
int thisSum, maxSum;
    
int i, j;
    
int tag;
    
int max;
    
int sta, msta, lst, mlst;

    scanf(
"%d"&cnt);
ExpandedSubBlockStart.gifContractedSubBlock.gif    
for (i = 1; i <= cnt; ++i) {
        printf(
"Case %d:\n", i);
        scanf(
"%d"&n);
        tag 
= 1;
ExpandedSubBlockStart.gifContractedSubBlock.gif        
for (j = 1; j <= n; ++j) {
            scanf(
"%d"&res[j]);
            
if (res[j] >= 0) tag = 0;
        }

ExpandedSubBlockStart.gifContractedSubBlock.gif        
if (tag) {
            max 
= 1;
ExpandedSubBlockStart.gifContractedSubBlock.gif            
for (j = 2; j <= n; ++j) {
                
if (res[j] > res[max]) max = j;
            }

            printf(
"%d %d %d\n", res[max], max, max);
        }

ExpandedSubBlockStart.gifContractedSubBlock.gif        
else {
ExpandedSubBlockStart.gifContractedSubBlock.gif            
for (j = 1; j <= n; ++j) {
                
if (res[j] >= 0break;
            }

            thisSum 
= maxSum = res[j];
            sta 
= lst = j;
            msta 
= mlst = j;
ExpandedSubBlockStart.gifContractedSubBlock.gif            
for (j = j+1; j <= n; ++j) {
                thisSum 
+= res[j];
                lst 
= j;
ExpandedSubBlockStart.gifContractedSubBlock.gif                
if (thisSum > maxSum) {
                    maxSum 
= thisSum;
                    msta 
= sta; mlst = lst;
ExpandedSubBlockStart.gifContractedSubBlock.gif                }
 else if (thisSum < 0{
                    thisSum 
= 0;
                    sta 
= lst = j+1;
                }

            }

            printf(
"%d %d %d\n", maxSum, msta, mlst);
        }

        
if (i != cnt) printf("\n");
    }

    system(
"pause");
    
return 0;
}

 

转载于:https://www.cnblogs.com/wsns/articles/1435896.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值