7-4最大子列和问题

(思想:

动态规划是一种解决多阶段决策过程的优化问题的数学思想和算法设计方法。它通常被用于处理具有重复子问题和最优子结构性质的问题。

在动态规划中,问题通常分解成若干个子问题,并存储已经求解的子问题的解。通过组合子问题的解来获得原始问题的解。

给定K个整数组成的序列{ N1N2, ..., NK },“连续子列”被定义为{ NiNi+1, ..., Nj },其中 1ijK。“最大子列和”则被定义为所有连续子列元素的和中最大者。例如给定序列{ -2, 11, -4, 13, -5, -2 },其连续子列{ 11, -4, 13 }有最大的和20。现要求你编写程序,计算给定整数序列的最大子列和。

本题旨在测试各种不同的算法在各种数据情况下的表现。各组测试数据特点如下:

  • 数据1:与样例等价,测试基本正确性;
  • 数据2:102个随机整数;
  • 数据3:103个随机整数;
  • 数据4:104个随机整数;
  • 数据5:105个随机整数;

输入格式:

输入第1行给出正整数K (100000);第2行给出K个整数,其间以空格分隔。

输出格式:

在一行中输出最大子列和。如果序列中所有整数皆为负数,则输出0。

输入样例:

6
-2 11 -4 13 -5 -2

输出样例:

20
#include<bits/stdc++.h>
using namespace std;
const int N = 10010;
int main(){
   int n,cnt=0,a[N],max=0;cin>>n;
   for(int i=0;i<n;i++){
      cin>>a[i];
   }
   for(int i=0;i<n;i++){
        cnt += a[i];
     if(cnt>max)max=cnt;
     if(cnt<0)cnt=0;
     }
     cout<<max;
}

7-9合并有序数列

给定2个非降序序列,要求把他们合并成1个非降序序列。假设所有元素个数为N,要求算法的时间复杂度为O(N)。

输入格式:

输入有4行。
第1行是一个正整数m,表示第2行有m个整数,这些整数构成一个非降序序列,每个整数之间以空格隔开。第3行是一个正整数n,表示第4行有n个整数,这些整数也构成一个非降序序列,每个整数之间以空格隔开。

输出格式:

把第2行的m个整数和第4行的n个整数合并成一个非降序序列,输出这个整数序列。每个数之间隔1个空格。

输入样例:

6
1 3 6 6 8 9  
4
2 4 5 7

输出样例:

1 2 3 4 5 6 6 7 8 9 
 
用向量做的,其中有一个小问题,是关于向量的输入的,如果长度已知,可以用数组的cin>>a[i];
如果向量长度未知,可以用a.push_back(  );这种。
如果是想用结构体做,结构体的定义应该如下
typedef struct array{
int len;
int data[N];//这样存数的时候就采用如下方式
}
array arr;
int n;cin>>n;
for(int i=0;i<n;i++){
  cin>>arr.data[i];
}
 
#include <iostream>
#include<vector>
using namespace std;
const int N = 10010;
int main(){
  int m,n;
  cin>>m;
vector<int>a(m);
for(int i=0;i<m;i++){
    cin>>a[i];
}
cin>>n;
vector<int>b(n);
for(int j=0;j<n;j++){
    cin>>b[j];
}
vector<int>c;
int i=0,j=0;
while(i<m&&j<n){
    if(a[i]>b[j]){
        c.push_back(b[j]);
        j++;

    }
    else{c.push_back(a[i]);
        i++;
    }
}
while(i<m){
   c.push_back(a[i]);
   i++;

}
while(j<n){
   c.push_back(b[j]);
   j++;
}
for(int idx=0;idx<m+n;idx++){
    cout<<c[idx]<<" ";
}
    return 0;
}
/*
6
1 3 6 6 8 9
4
2 4 5 7

*/

7-8 一元多项式的加法

设计程序求两个一元多项式的和。

输入格式:

输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数。数字间以空格分隔。

输出格式:

输出1行,以指数递降方式输出和多项式非零项的系数和指数(保证不超过整数的表示范围)。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0。

输入样例:

4 3 4 -5 2  6 1  -2 0
3 5 20  -7 4  3 1

输出样例:

5 20 -4 4 -5 2 9 1 -2 0
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

struct Term {
    int coefficient;
    int exponent;
};

bool compareTerms(const Term &a, const Term &b) {
    return a.exponent > b.exponent; // 按指数递减排序
}

int main() {
    vector<Term> poly1, poly2, result;
    int n, coefficient, exponent;

    // 读取第一个多项式
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> coefficient >> exponent;
        poly1.push_back({coefficient, exponent});
    }

    // 读取第二个多项式
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> coefficient >> exponent;
        poly2.push_back({coefficient, exponent});
    }

    // 计算多项式和,这道题的下面这部分和求两个顺序表并在一起是一个思路,只不过是把指数相等的对应相加而已
    int i = 0, j = 0;
    while (i < poly1.size() && j < poly2.size()) {
        if (poly1[i].exponent > poly2[j].exponent) {
            result.push_back(poly1[i]);
            i++;
        } else if (poly1[i].exponent < poly2[j].exponent) {
            result.push_back(poly2[j]);
            j++;
        } else {
            int sum = poly1[i].coefficient + poly2[j].coefficient;
            if (sum != 0) {
                result.push_back({sum, poly1[i].exponent});
            }
            i++;
            j++;
        }
    }

    while (i < poly1.size()) {
        result.push_back(poly1[i]);
        i++;
    }

    while (j < poly2.size()) {
        result.push_back(poly2[j]);
        j++;
    }

    // 对结果进行排序
    sort(result.begin(), result.end(), compareTerms);

    // 输出结果
    if(result.size()!=0){
         for (int i = 0; i < result.size(); i++) {
        cout << result[i].coefficient << " " << result[i].exponent;
        if (i < result.size() - 1) {
            cout << " ";
        }
    }
    }
   if(result.size()==0){
       cout<<"0 0";
   }

    return 0;
}

7-2 递增有序顺序表的插入

实验目的:1、掌握线性表的基本知识 2、深入理解、掌握并灵活运用线性表。3、熟练掌握线性表的存储结构及主要运算的实现
已知顺序表L递增有序,将X插入到线性表的适当位置上,保证线性表有序。。

输入格式:

第1行输入顺序表长度,第2行输入递增有序的顺序表,第3行输入要插入的数据元素X。

输出格式:

对每一组输入,在一行中输出插入X后的递增的顺序表。

输入样例:

在这里给出一组输入。例如:

5
1 3 5 7 9
6

输出样例:

在这里给出相应的输出。例如:

1,3,5,6,7,9,
#include<iostream>
#define N 100000
using namespace std;
int a[N];
int n;
typedef struct List{
	int data[N];
	int len;
}List;

void initList(List& L) {
	L.len = 0;
}
void CreatList(List& L) {
	for (int i = 0; i < n; i++) {
		L.data[i] = a[i];
		L.len++;
	}
}
void InsertList(List &L,int b) {
	int i = L.len-1;//注意此处
	L.len++;
	while (L.data[i] > b) {
		L.data[i + 1] = L.data[i];
		i--;
	}
	L.data[i + 1] = b;
}
void disPlayList(List& L) {
	for (int i = 0; i < L.len ; i++) {
		cout << L.data[i] << ",";
	}
}
int main() {
	cin >> n;
	if (n < N) {
		for (int i = 0; i < n; i++) {
			cin >> a[i];
		}
	}
	int b; cin >> b;
	List L;
	initList(L);
	CreatList(L);
	InsertList(L,b);
	disPlayList(L);
	return 0;
}
/*
6
1 2 3 5 6 7
4
*/

7-3 顺序表(删除)

已知一组数据,采用顺序存储结构存储,其中所有的元素为整数。设计一个算法,删除元素值在[x,y]之间的所有元素

输入格式:

输入包含三行数据,第一行是表中元素个数,第二行是顺序表的各个元素,第三行是区间x和y。

输出格式:

删除元素值在[x,y]之间的所有元素后,输出新的顺序表。(最后无空格)

输入样例:

在这里给出一组输入。例如:

10
55 11 9 15 67 12 18 33 6 22
10 20

输出样例:

在这里给出相应的输出。例如:

55 9 67 33 6 22

 

#include<iostream>
#include<vector>
#define N 100000
using namespace std;
int n;
vector<int>a;
int main() {
	int n,b; cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> b;
		a.push_back(b);
	}
	int c, d; cin >> c >> d;
	for (int i = 0; i < a.size(); i++) {
		if (a[i]<d && a[i]>c) {
			a.erase(a.begin() + i);
			i--;
		}
	}
	for (int i = 0; i < a.size()-1; i++) {
		cout << a[i] << " ";
	}cout << a[a.size() - 1];
}
/*
6
1 2 3 5 6 7
4 8
*/

 

7-4 最大子列和问题

给定个整数组成的序列{ , , ..., },“连续子列”被定义为{ , , ..., },其中 。“最大子列和”则被定义为所有连续子列元素的和中最大者。例如给定序列{ -2, 11, -4, 13, -5, -2 },其连续子列{ 11, -4, 13 }有最大的和20。现要求你编写程序,计算给定整数序列的最大子列和。

本题旨在测试各种不同的算法在各种数据情况下的表现。各组测试数据特点如下:

  • 数据1:与样例等价,测试基本正确性;
  • 数据2:102个随机整数;
  • 数据3:103个随机整数;
  • 数据4:104个随机整数;
  • 数据5:105个随机整数;

输入格式:

输入第1行给出正整数 ();第2行给出个整数,其间以空格分隔。

输出格式:

在一行中输出最大子列和。如果序列中所有整数皆为负数,则输出0。

输入样例:

6
-2 11 -4 13 -5 -2

输出样例:

20
 
#include<iostream>
#include<vector>
using namespace std;
vector<int>a;
int main() {
	int n,b,sum=0,mx=0; cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> b;
		a.push_back(b);
	}
	for (int i = 0; i < a.size(); i++) {
		sum += a[i];
		if (sum < 0)sum = 0;
		else {
			mx = max(sum, mx);
		}
	}
	cout << mx;
	return 0;
}

7-5 数组元素循环右移n位

从键盘接收两个整数m和n,分别表示一维整型数组的元素个数,和要向移动的位数。已知0<m<=100,以及n>0。

在用户输入m和n后,第二行输入相应个数的数组元素。

程序要实现的功能是,让数组元素往右移动n位

例如,数组的5个元素是:1,2,3,4,5。

往右移动1位后:5,1,2,3,4

往右移动2位后:4,5,1,2,3

输入格式:

第一行输入两个整数,第二行输入数组元素。

输出格式:

移动后,数组的每一个元素,注意每个数组元素后有且仅有一个空格。

输入样例:

第一行的数据5和2,表示数组容量为5,让数组元素往右移动2个位置。

第二行是数组的每一个元素的值。

5 2
1 2 3 4 5 

输出样例:

输出移动后的数组元素值,注意每个元素后有且仅有一个空格。

4 5 1 2 3 
#include<iostream>
#include<vector>
using namespace std;
vector<int>a;
int main() {
	int n,b,c; cin >> n>>c;
	for (int i = 0; i < n; i++) {
		cin >> b;
		a.push_back(b);
	}
	int d = c % n;
	for (int i = a.size() - d ; i < a.size(); i++) {
		cout << a[i]<<" ";
	}
	for (int i = 0; i <= a.size() - d - 1; i++) {
		cout << a[i]<<" ";
	}//cout <<a[ a.size() - d - 1];
	return 0;
}

7-6 单词逆置

输入一个可能包含若干(至少1个)单词的句子(可以假设每个单词之间有且仅有一个空格,标点符号视为单词的组成部分),输出每个单词逆置后的英文句子(参看样例输出)。

输入格式:

首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试数据输入一个字符串(长度不超过80),表示英文句子。

输出格式:

对于每组测试,输出每个单词逆置后的英文句子。

输入样例:

1
emoclew era uoY

输出样例:

welcome are You
#include<iostream>
#include<vector>
#include<string>
using namespace std;
vector<int>a;
int main() {
	int n; cin >> n;
	getchar();
	while (n--) {
		string str;
		getline(cin,str);
		if (str[0] != ' ')str = ' '+ str;
		if (str[str.size() - 1] != '0')str = str + ' ';
		int head = 0;
		for (int i = head + 1; i < str.size(); i++) {
			while (str[i] != ' ')i++;
			for (int j = i-1; j >=head+1; j--) {
				cout << str[j];
			}
			
			head = i;
			if (str[head + 1] == '\0') break;
			cout << ' ';
		}
		cout << endl;
	}
	return 0;
}

 

posted on 2024-05-16 22:12  fafrkvit  阅读(127)  评论(1编辑  收藏  举报