2018年北京邮电大学数据结构与算法第一次作业 问题C
2018-03-15 16:06
239 查看
Problem C:
该问题是问题B的升级版本。
其主要设计思路与问题B相似,基于问题B的程序,我将
之中的
以下是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; }
相关文章推荐
- 2018年北京邮电大学数据结构与算法第一次作业 问题A
- 2018年北京邮电大学数据结构与算法第一次作业 问题D
- 2018年北京邮电大学数据结构与算法第一次作业 问题B
- 第一次大作业的问题
- 大三上第一次作业--12个Linux基本问题的讨论
- 第一次作业遇到的问题
- cs231n的第一次作业knn的问题
- 第一次作业金币问题
- 第一次实验作业(NPC问题----回溯算法,聚类分析)
- C++第一次作业-质数问题和百钱买百鸡问题以及分段函数问题
- 第一次作业:提五个问题
- 关于软件工程的学习问题第一次作业
- 软件工程第一次作业 - 针对《构建之法》提出的五个问题
- 【Highestop】第一次个人作业项目总结【链接】
- 计科《算法设计与分析》第七周作业1——背包问题
- SDN第一次上机作业
- 第一次实验 八皇后及N皇后问题
- SDN第一次上机作业
- 作业中,调用DTS包的问题
- SDN2017 第一次实验作业