您的位置:首页 > 理论基础 > 数据结构算法

2018年北京邮电大学数据结构与算法第一次作业 问题C

2018-03-15 16:06 239 查看
Problem C:



该问题是问题B的升级版本。

其主要设计思路与问题B相似,基于问题B的程序,我将
void Calcu(int &Seq, int &Ccolumn_Sum_Seq,int K)
函数(如下)

void Calcu(int *&Seq, int *&Ccolumn_Sum_Seq,int K)
{
int count = 0;
for (int ccn = 1; ccn <= K; ccn++)//子列中的元素个数
for (int i = 0; i <= K - ccn; i++)//子列首元素位置
{
for (int j = i; j < i + ccn; j++)//遍历子列
Ccolumn_Sum_Seq[count] += Seq[j];
count++;
}
}


之中的
for (int ccn = 1; ccn <= K; ccn++)
语句改为了
for (int ccn = K; ccn >=1; ccn--)
,这样在之后的扫描选取最大子列时,所选出的子列即为符合要求的最大子列。

以下是C++的程序实现:

#include <iostream>
using namespace std;
void Calcu(int *&Seq, int *&Ccolumn_Sum_Seq, int K)
{
int count = 0;
for (int ccn = K; ccn >=1; ccn--)//子列中的元素个数
for (int i = 0; i <= K - ccn; i++)//子列首元素位置
{
for (int j = i; j < i + ccn; j++)//遍历子列
{
Ccolumn_Sum_Seq[count] += Seq[j];
}
count++;
}
}
int Sort_Max(int *Ccolumn_Sum_Seq, int C_Column_Sum_Num)
{
for (int i = 0; i<C_Column_Sum_Num - 1; i++)
for (int j = i + 1; j < C_Column_Sum_Num; j++)
if (Ccolumn_Sum_Seq[i] < Ccolumn_Sum_Seq[j])
{
Ccolumn_Sum_Seq[i] ^= Ccolumn_Sum_Seq[j];
Ccolumn_Sum_Seq[j] ^= Ccolumn_Sum_Seq[i];
Ccolumn_Sum_Seq[i] ^= Ccolumn_Sum_Seq[j];
}
return Ccolumn_Sum_Seq[0];
}
bool IfNegative(int *&Seq, int K)
{
int count = 0;
for (int i = 0; i < K; i++)
if (Seq[i] < 0)count++;
if (count == K) return true;
else return false;
}
void Select(int Sum_Max, int *Ccolumn_Sum_Seq, int *Seq, int *Anwser, int C_Column_Sum_Num, long K)
{
int temp = 0;
for (int i = 0; i < C_Column_Sum_Num; i++)
if (Ccolumn_Sum_Seq[i] == Sum_Max)
{
temp = i;
break;
}
int coordinate[2] = { 0 };
temp += 1;
for (int i = 0; i <= K; i++)
{
temp -= i;
if (temp <= i + 1)
{
coordinate[0] = i + 1;
coordinate[1] = temp;
break;
}
}
Anwser[1] = Seq[coordinate[1]-1];
Anwser[2] = Seq[coordinate[1] + K - coordinate[0]-1];
}

int main()
{
long K = 0;
/*//cin >> K;
//while (K > 100000 || K < 0)
//{
//cout << "Input Error !" << '\n'
//  << "Please Reinput:" << endl;
//  cin >> K;
//}*/
do {
cin >> K;
} while (K>100000);
int*Seq = new int[K];
for (int i = 0; i < K; i++)
cin >> Seq[i];
if (IfNegative(Seq, K))
{
cout << 0 <<" "<<Seq[0]<<" "<< Seq[K-1] << endl;
system("pause");
return 0;
}
int C_Column_Sum_Num = K * (K + 1) / 2;
int*Ccolumn_Sum_Seq = new int[C_Column_Sum_Num];
for (int i = 0; i < C_Column_Sum_Num; i++)Ccolumn_Sum_Seq[i] = 0;
Calcu(Seq, Ccolumn_Sum_Seq, K);

/*//for (int i = 0; i < C_Column_Sum_Num; i++)
//{
//  cout << Ccolumn_Sum_Seq[i] << " ";
//}
//cout << endl;*/

int *Temp_Seq = new int[C_Column_Sum_Num];
for (int i = 0; i < C_Column_Sum_Num; i++) Temp_Seq[i] = Ccolumn_Sum_Seq[i];
int Sum_Max = Sort_Max(Temp_Seq, C_Column_Sum_Num);

/*//int *Ccolumn_Max = new int[C_Column_Sum_Num];
//Selcet_Max_Ccolumn(Ccolumn_Sum_Seq, Sum_Max, Ccolumn_Max);
//cout << Sum_Max << endl;*/

int Anwser[3] = { Sum_Max, 0 ,0 };
Select(Sum_Max, Ccolumn_Sum_Seq, Seq, Anwser, C_Column_Sum_Num, K);

cout << Anwser[0] << " " << Anwser[1] << " " << Anwser[2] << endl;
delete[]Seq;
delete[]Ccolumn_Sum_Seq;
/*//delete[]Ccolumn_Max;*/

system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: