今日头条2018校招算法方向(第一批)编程题2

题目链接:点击打开链接

时间限制:3秒

空间限制:131072K

给定一个数组序列, 需要求选出一个区间, 使得该区间是所有区间中经过如下计算的值最大的一个:

区间中的最小数 * 区间所有数的和最后程序输出经过计算后的最大值即可,不需要输出具体的区间。如给定序列  [6 2 1]则根据上述公式, 可得到所有可以选定各个区间的计算值:

 

[6] = 6 * 6 = 36;

[2] = 2 * 2 = 4;

[1] = 1 * 1 = 1;

[6,2] = 2 * 8 = 16;

[2,1] = 1 * 3 = 3;

[6, 2, 1] = 1 * 9 = 9;

 

从上述计算可见选定区间 [6] ,计算值为 36, 则程序输出为 36。

区间内的所有数字都在[0, 100]的范围内;


输入描述:
第一行输入数组序列长度n,第二行输入数组序列。
对于 50%的数据,  1 <= n <= 10000;
对于 100%的数据, 1 <= n <= 500000;


输出描述:
输出数组经过计算后的最大值。

输入例子1:
3
6 2 1

输出例子1:
36

这道题的题意就是求区间中的最小数 * 区间所有数的和的最大值。做法:假设每个数都是最小数,然后向左向右找出他的最大区间即可。这道题让我深深的明白了不仅仅是可以用空间来换时间(打表),而且也可以用时间来换空间。所以一定要节约内存该开的开不该开的不开。

数据过了80%,浪费太多空间了。

#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;

int a[500009],b[500009],c[500009];
int main()
{
   int n;
   while(cin>>n)
   {
       for(int i=0;i<n;i++)
       {
           cin>>a[i];
           b[i]=a[i];
       }
       for(int i=0;i<n;i++)
       {
           for(int j=i+1;j<n;j++)
           {
               if(a[i]<=a[j])
               {
                   b[i]+=a[j];
               }
               else
               {
                   break;
               }
           }
       }
       for(int i=n-1;i>=0;i--)
       {
           for(int j=i-1;j>=0;j--)
           {
               if(a[i]<=a[j])
               {
                   b[i]+=a[j];
               }
               else
               {
                   break;
               }
           }
       }
       int max=a[0]*b[0];
       for(int i=1;i<n;i++)
       {
           if(max<a[i]*b[i])
           max=a[i]*b[i];
       }

       cout<<max<<endl;
   }
    return 0;
}

AC代码

#include <iostream>
#include <stack>
#include <algorithm>
using namespace std;
typedef long long ll;
int main()
{
   int n;
   while(cin>>n)
   {
       int a[n];
       for(int i=0;i<n;i++)
       {
           cin>>a[i];
       }
       int max=0;
       for(int i=0;i<n;i++)
       {
           int s=a[i];
           for(int j=i+1;j<n;j++)
           {
               if(a[i]<=a[j])
               {
                   s+=a[j];
               }
               else
               {
                   break;
               }
           }
           for(int j=i-1;j>=0;j--)
           {
               if(a[i]<=a[j])
               {
                   s+=a[j];
               }
               else
               {
                   break;
               }
           }

           if(max<a[i]*s)
           max=a[i]*s;
       }
       cout<<max<<endl;
   }
    return 0;
}
看网上还有一些是用单调栈写的


猜你喜欢

转载自blog.csdn.net/weixin_36416680/article/details/80332593
今日推荐