题目:
思路:
1.先进行排序
2.每次选最小的序列合并得最少比较次数
每次选最大的序列合并得最多比较次数
代码在这里~:
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
//最优合并问题
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
ifstream fin("merge10.in",ios::in);
ofstream fout("answer10.txt");
int n;
fin>>n;
int a[n],b[n];
for(int i=0;i<n;i++)
{
fin>>a[i];
b[i]=a[i];
}
int maxc=0, minc=0;
for(int i=0;i<n-1;i++)
{
sort(a+i,a+n);
a[i+1]=a[i]+a[i+1];
minc=minc+a[i+1]-1;
}
for(int i=0;i<n-1;i++)
{
sort(b+i,b+n,cmp);
b[i+1]=b[i]+b[i+1];
maxc=maxc+b[i+1]-1;
}
cout<<maxc<<" "<<minc;
fout<<maxc<<" "<<minc;
fin.close();
fout.close();
return 0;
}