P9787 [ROIR 2020 Day2] 最大乘积 题解
KDL_ANIPLEX · · 题解
题目分析
题意简述
给定一个自然数组成的数组
求出一个整数
对于
题目分析
- 由于
n\le 2\cdot 10^5 ,考虑O(n) 的算法。 - 基本思路:
- 读入,读入的同时进行前缀和(记录
\sum_{j=1}^{i}{a_j} )。 - 重头扫一遍,根据“和不变,差小积大”的原理,记录两个因数差的绝对值最小时的
i 。 - 输出
i 。
- 读入,读入的同时进行前缀和(记录
- 复杂度:
- 读入、前缀和:
O(n) 。 - 重头扫一遍:
O(n) 。 - 输出:
O(1) 。
整体复杂度为O(n) 。
- 读入、前缀和:
- 注意事项:
- 开
longlong。代码
#include<cstdio> long long a[200001],s=1e17,n,l; long long abss(long long x,long long y)//绝对值函数 { if (x>y) return x-y; return y-x; } int main(){ scanf ("%d",&n); for (int i=1;i<=n;i++){ int u; scanf ("%d",&u);//读入。 a[i]=a[i-1]+u;//前缀和。 } for (int i=1;i<=n;i++){ long long o=abss(a[i],a[n]-a[i]);//两个因数差的绝对值。 if (o<s) s=o,l=i;//记录目前最小的差与答案。 else break;//小优化:如果已经比 s 大,那后面的也会比 s 大,所以退出。 } printf ("%d\n",l); return 0; }
- 开