学了贪心算法后的作业:
/*
*作者 neeso*完成日期:2018/4/22
*问题名称:最优合并问题
*问题描述:
给定k个排好序的序列s1,s2,…,sk,(从input.txt中读入序列个数,以及单个序列的长度)用2路合并算法将这k个序列合并成一个序列
。假设所采用的2路合并算法合并两个长度分别为m和n的序列需要m+n-1次比较。
试设计一个算法确定合并这个序列的最优合并顺序,使所需要的总比较次数最少
和最多。并输出到output.txt 中,(最少在前,最多在后)
*/
#include<iostream>
#include<stdio.h>
#include <algorithm>
#include<vector>
#include<fstream>
using namespace std;
bool compare(int a, int b)
{
return a<b; //升序排列,如果改为return a>b,则为降序
}
void zuiyouhebin()
{
int i;
int number ;
int sum_max = 0;
int sum_min = 0;
ifstream infile("input.txt", ios::in);
infile >> number;
int* a = new int[number];
// int a[] = { 5, 12, 11, 2 };
int *b = new int[number];
for (i = 0; i < number; i++)
{
infile >> a[i];
}
infile.close();
for (i = 0; i < number; i++)
{
b[i] = a[i];
}
for (i = 0; i < number - 1; i++)
{
sort(a + i, a + number,compare);
a[i + 1] += a[i];
sum_max += (a[i + 1] - 1);
}
for (i = 0; i < number - 1; i++)
{
sort(a + i, a + number);
a[i + 1] += a[i];
sum_min += (a[i + 1] - 1);
}
cout << sum_min<<endl;//用来检验输出
cout << sum_max << endl;//用来检验输出
ofstream outfile("output.txt", ios::out);
outfile << sum_min<< '\t' << sum_min;
outfile.close();
system("pause");
}
int main()
{
zuiyouhebin();
return 0;
}