题目
在一个数组中, 每一个数左边比当前数小的数累加起来, 叫做这个数组的小和。 求一个数组
的小和。
例子:
[1,3,4,2,5]
1左边比1小的数, 没有;
3左边比3小的数, 1;
4左边比4小的数, 1、 3;
2左边比2小的数, 1;
5左边比5小的数, 1、 3、 4、 2;
所以小和为1+1+3+1+1+3+4+2=16
分析
先放着,等有空写
代码
#include "stdafx.h"
#include<iostream>
#include<vector>
using namespace std;
int Merge(vector<int>array, int L, int R)
{
int i = 0;
int result=0;
vector<int>Help(R-L+1);
int m = L + ((R - L) >> 1);
int p1 = L;
int p2 = m + 1;
while (p1 <= m && p2 <= R)
{
if (array[p1] < array[p2])
{
result += array[p1] * (R - p2 + 1);
}
else
result += 0;
Help[i++] = array[p1] < array[p2] ? array[p1++] : array[p2++];
}
cout << "p1" << p1 << "p2 " << p2 << endl;
while (p2<R)
{
Help[i++] = array[p2++];
}
while (p1<m)
{
Help[i++] = array[p1++];
}
for (int i = 0; i < Help.size(); i++)
{
array[L+i] = Help[i];
}
return result;
}
int MergeSort(vector<int>array, int L, int R)
{
if (L == R)
return 0;
int mid = L + ((R - L) >> 1);
return MergeSort(array, L, mid) + MergeSort(array, mid + 1, R) + Merge(array, L, R);
}
int small_sum(vector<int>array)
{
if (array.size() < 2)
return 0;
return MergeSort(array, 0, array.size() - 1);
}