1001 Problem A

来源:互联网 发布:还原网络设置会怎样 编辑:程序博客网 时间:2024/06/03 16:03

题意:
给一串数求其中某一段的最大值 并且求出这一段的起点和终点
思路:
我一开始想的是由a[i][j]=a[i-1][j]+a[i][j+i]来做
如图所示
就像这样 我以为一串数最多二十个
代码如下

#include<iostream>#include<fstream>using namespace std;int a[20][20];int main(){    //fstream cin("E:/C++/IN/aaa.txt");    int b;    cin >> b;    int d = b;    while (b--)    {        int m,n,t = 0;        m = n = 0;        int c = 0;        cin >> c;        for (int i = 0;i < c;i++)        {            cin >> a[i][i];        }        for (int i = 0;i < c;i++)            for (int j = i + 1;j < c;j++)            {                a[j][i] = a[j - 1][i] + a[j][i + j];                if (t < a[j][i])                {                    t = a[j][i];                    m = i+1;                    n = j+1;                }            }        if (d - b - 1)cout << endl;        cout << "Case " << d-b<<":"<<endl;        cout << t << " " << m << " " << n << endl;    }    return 0;}

但是 后来我发现一串数最多可以有100000个 那样 就没法用数组做了
后来的做法是:
每一次输入都与前面数的和相加 如果结果还小于输入的数 那证明前面数的和为负数 那这一段肯定会使最后的和变小 所以要去掉 即把开始数置为这个数。否则保留和 与最大值比较 如果比最大值大 保存为最大值,把结束计数置为此时的数。

#include<iostream>#include<fstream>using namespace std;int a;int main(){    //fstream cin("E:/C++/IN/aaa.txt");    int b;    cin >> b;    int d = b;    while (b--)    {        //s为开始计数,e为结束计数。m为中间数用于传递值,t为前面数的和        int s,e,m,t = -1000;        int max = -1000;        s=e=m = n = 1;        int c = 0;        cin >> c;//输入一共多少个数        cin >> t;//输入第一个数,初始化前面数的和        max = t;//初始化和的最大值        for (int i = 2;i <= c;i++)//共输入c-1个数        {            cin >> a;//输入新的数            if (a > t + a)//如果新的数小 重置            {                t = a;//重新初始化 相当于把前一段数扔掉                m = i;//把开始计数器置为当前值            }            else            {                t = t + a;//前面数的和相加            }            if(t>max)//判断已经输入的数的和与最大值的大小            {                max = t;//如果比最大值大 最大值置为当前状态                s = m;                e = i;            }        }        cout << "Case " << d-b<<":"<<endl;        cout << max << " " << s << " " << e << endl;        if (b)cout << endl;//输出的空行    }    return 0;}
0 0