Preliminaries for Benelux Algorithm Programming Contest 2019: I. Inquiry I
论算法优化的重要性
要有分析算法时间复杂度的潜意识,慢慢培养。
别总是上来暴力,还有可怕的两层循环2333qwq
The Bureau for Artificial Problems in Competitions wants you to solve the following problem: Given n positive integers a1, . . . , an, what is the maximal value of

Input:
• A single line containing an integer 2 ≤ n ≤ 10^6.
• Then follow n lines, the ith of which contains the integer 1 ≤ ai ≤ 100.
Output:
Output the maximal value of the given expression.
样例输入1
5
2
1
4
3
5
样例输出1
168
样例输入2
2
1
1
样例输出2
1
样例输入3
10
8
5
10
9
1
4
12
6
3
13
样例输出3
10530
分析:我一上来就是两层循环直接暴力,然后2000ms直接TLE了,接着优化一下输入输出1995ms,继续tle,最后靠着fy大佬帮我优化代码,


我最初tle的代码:
#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
ll n;//n要设为全局变量2333,要不然不能输入啦
int a[1000006];
int main()
{
scanf("%lld",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
//k [1,n-1]
ll maxval=0;
int k,i;
for(k=1;k<=n-1;k++)
{
ll p=0,q=0;
for(i=1;i<=k;i++)
{
p+=a[i]*a[i];
}
for(i=k+1;i<=n;i++)
{
q+=a[i];
}
maxval=max(p*q,maxval);
}
printf("%lld\n",maxval);
}
//TLE了qwq
//优化过后从2000ms到1995ms,qwq
//tle了太卑微了qwq
//我这是单纯的暴力
优化后成功AC的代码:
#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
ll n;
int a[1000006];
ll f1[1000006]={0};
ll f2[1000006]={0};
int main()
{
scanf("%lld",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
f2[0]+=a[i];
}
for(int k=1;k<=n-1;k++)
{
f1[k]=f1[k-1]+a[k]*a[k];
f2[k]=f2[k-1]-a[k];
}
ll maxval=0;
for(int k=1;k<=n-1;k++)
{
maxval=max(maxval,f1[k]*f2[k]);
}
printf("%lld\n",maxval);
}//这样时间就得到了顺利的优化2333
//在法人的帮助下成功ac了,法人say:要有这个潜意识,慢慢培养
//运行时间和编译时间是不搭边的吧2333
//"我想想,能不能化简一下公式"进行算法复杂度分析
提供的标程代码:
/*
求公式最大值
*/
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <vector>
#include <string>
#include <stack>
#include <queue>
typedef long long LL;
using namespace std;
int n, a[1000005];
LL l[1000005], r[1000005];
int main()
{
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
scanf("%d", &n);
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
for (int i = 1; i <= n; i++) l[i] = l[i - 1] + a[i] * a[i];
for (int i = n; i >= 1; i--) r[i] = r[i + 1] + a[i];
LL ans = 0;
for (int i = 1; i < n; i++) ans = max(ans, l[i] * r[i + 1]);
printf("%lld\n", ans);
return 0;
}
/**/
浙公网安备 33010602011771号