题目大意:给定数组A,长度为ASize,分别用【0~ASize-1】作为各项的系数,求最大值。例子比较明了
A = [4, 3, 2, 6] F(0) = (0 * 4) + (1 * 3) + (2 * 2) + (3 * 6) = 0 + 3 + 4 + 18 = 25 F(1) = (0 * 6) + (1 * 4) + (2 * 3) + (3 * 2) = 0 + 4 + 6 + 6 = 16 F(2) = (0 * 2) + (1 * 6) + (2 * 4) + (3 * 3) = 0 + 6 + 8 + 9 = 23 F(3) = (0 * 3) + (1 * 2) + (2 * 6) + (3 * 4) = 0 + 2 + 12 + 12 = 26 So the maximum value of F(0), F(1), F(2), F(3) is F(3) = 26.大致思路:
【暴力】分别结算每个位置的F[i],分别比较,然后求最大值,大数据测试集合TLE。
【改进】找规律,发现F[i]-F[i+1]=Sum[0~Asize-1]-n*A[i],发现这个规律之后没有及时的运用,有点遗憾。
进一步找到F[i]-F[j]=[j-i]*Sum[0~Asize-1]-n*Sum[i~j-1];
我运用这个公式,避免了每次都计算F[i],在测试过程中,发现判断条件那里容易溢出,改为除法比较之后才通过,代码如下:
CODE:
int cal(int *a,int n,int i){
int res=0,j;
for(j=0;j
后面运用第一个公式,重做了一遍,代码简洁了很多。代码如下:
int maxRotateFunction(int* A, int ASize) {
if(ASize==0) return 0;
int res=0,sum=0,i,temp;
for(i=0;i
res) res=temp;
}
return res;
}