杭电ACM-1003-Max Sum ...

        说到这个题吧,又想说那句话:难的不会,会的不难。我前前后后大概有10天的时间,只要课余有时间就想想这个题,结果还是没有想出来。结果后来请问了一个学长之后 ,才发现我离这个正确的方法就差那么一步,可也就正是那么关键的一步。总结只有一条:得像高中一样,多做题才能多长见识,才能见到更多的算法!!!! 努力!


04-06-2015

至于题目,大家请前往这儿(http://acm.hdu.edu.cn/showproblem.php?pid=1003)


下面就是代码,若哪儿有不对或是什么建议,请各位观者不吝指出!





#include<iostream>
using namespace std;
int main()
{
    int line;//行数
    cin >> line;
	if(line<=0)//若行数小于等于0,退出
		exit(-1);
    int t=line;//控制格式
    int *p;

    for(int i = 0; i < line; i++)// line行,循环line次
    {
        int n;//元素个数
        cin >> n;
		if(n<=0)//若元素数小于等于0,退出
			exit(-1);
        p = new int[n];//为n个元素申请内存

        for(int j = 0; j < n; j++)
            cin >> p[j]; // 输入元素

        int sum = 0; // 保存总和
        int Max;//保存当前最大的和
        int begpos = 0; //开始位置
        int endpos = 0; //结束位置
        int temp = 0;//中间变量,存储位置
        int k ;
        Max = 0;
        sum = p[0];

        for(k = 0; k < n; k++)// n个元素,循环n次
        {
            Max += p[k];// 累加当前的元素

    

            if(Max > sum)// 若当前元素的和大于sum
            {
                begpos = temp;
                endpos = k;
                sum = Max;//  赋值给sum
				if(Max<0)// 即使是Max>sum,Max也有可能是负数,所以加上判断;
				{
					Max=0;		// 如果没有这个判断,比如计算这个数组就会错
					temp=k+1;	// -6 -4 -3 -7
					endpos=k;	// 第2个数大于第一个数,所以 sum=-4,但此时Max=-4并没有
				}				//被赋值为0,加上下一个(-3),Max=-7 < sum=-4;些时Max被赋值为Max=0;
            }					//这样导致的结果就是之前的sum=-4,没有同Max=-3进行比较,所以会出错
            else if(Max < 0)
            {
                Max = 0;
                temp = k + 1; //暂时保存begpos
            }
        }
		delete []p;//释放空间

        if(i < t - 1)// 这个 只是为了控制格式的需要,前line-1行之后要有空格,最后一行后不留空行
            cout << "Case " << i + 1 << ":" <<endl<< sum << " " << begpos + 1 << " " << endpos + 1 << endl << endl;

        else cout << "Case " << i + 1 << ":" <<endl<< sum << " " << begpos + 1 << " " << endpos + 1 << endl;
    }

    system("pause");
    return 0;
}




转载于:https://www.cnblogs.com/tolic/p/7142281.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值