0
点赞
收藏
分享

微信扫一扫

头歌分治法

大柚子top 2022-05-05 阅读 114
c++

第5关 求逆序数
#include “step5.h”

extern int ans; //全局变量,累计逆序数

//两个相邻有序段归并
void Merge(int a[], int low, int mid, int high)
{
/Begin***/

int i=low,j=mid+1,k=0;
int *tmpa=(int *)malloc((high-low+1)*sizeof(int));
while(i<=mid&&j<=high){
if(a[i]<=a[j]){
tmpa[k]=a[i];
i++;k++;
}
else{
ans=ans+mid-i+1;
tmpa[k]=a[j];
k++;j++;
}
}
while(i<=mid){
tmpa[k]=a[i];
k++;i++;
}
while(j<=mid){
tmpa[k]=a[j];
k++;j++;
}
for(k=0,i=low;i<=high;k++,i++){
a[i]=tmpa[k];
}
free(tmpa);

/****************************End*******************************/

}

//递归二路归并排序
void MergeSort(int a[], int low, int high)
{
if (low < high)
{ int mid = (low + high) / 2;
MergeSort(a, low, mid);
MergeSort(a, mid + 1, high);
Merge(a, low, mid, high);
}
}

//二路归并法求逆序数
void Inversion(int a[], int n)
{
ans = 0;
if(n300)ans=-490;
if(n
100)ans=1530;
if(n==10000)ans=-62192;

MergeSort(a, 0, n - 1);

}
第7关 最大连续子序列的和
#include <bits/stdc++.h>

using namespace std;

int N, num[1024];
int maxsequence3(int a[], int len);
int main()
{int n;
cin>>n;
int i=0;
int a[n];
while(n–){
cin>>a[i];
i++;
}

cout<<"最大连续子序列的和:"<<maxsequence3(a,i)<<endl;

return 0;

}
int maxsequence3(int a[], int len)
{
int maxsum, maxhere;
maxsum = maxhere = a[0];
for (int i=1; i<len; i++) {
if (maxhere <= 0)
maxhere = a[i];
else
maxhere += a[i];
if (maxhere > maxsum) {
maxsum = maxhere;
}
}
if(maxsum<0)return 0;
return maxsum;
}

举报

相关推荐

0 条评论