数据结构第二次实验题解

数据结构第二次实验题解

一、7-1 数列查询

已知数列的通项公式为:

 f(n) = f(n-1)*11/10,f[1]=10. 

通项从左向右计算,*和/分别表示整数乘法和除法。 现在,要多次查询数列项的值。

输入格式:
第1行,1个整数q,表示查询的次数, 1≤q≤10000. 第2至q+1行,每行1个整数i,表示要查询f(i)的值。

输出格式:
q行,每行1个整数,表示f(i)的值。查询的值都在32位整数范围内。

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

3
1
2
3
输出样例:
在这里给出相应的输出。例如:

10
11
12
数据结构第二次实验题解_第1张图片

说实话,看到时间限制10ms时并没有什么感觉,但是当我们使用暴力法或者直接递归求解时就会发现一不留神就超时。我使用了一种很巧妙的方法:用一个max变量来保存输入数据的最大值,同时用一个数组来保存从1到max的所有函数值,所以在这个最大值之前元素的对应函数值都是可以拿到的,这样一来我们取f(i)的值的操作就是O(1)阶的,避免了重复计算,省去了很多时间。

#include
using namespace std;
int f[20000]; 
int main(){
   
	int q,max=0;
	int i,a[20000];
	cin>>q;
    for(i=1;i<=q;i++){
   
    	scanf("%d",&a[i]);
    	if(max<a[i]) max=a[i];
	}
	f[1]=10;
	for(i=1;i<=max;i++){
   
		f[i+1]=f[i]*11/10;
	}
	for(i=1;i<=q;i++){
   
		printf("%d",f[a[i]]);
            printf("\n");
	}
} 

二、7-2 稀疏矩阵之和

矩阵A和B都是稀疏矩阵。请计算矩阵的和A+B.如果A、B不能做和,输出“Illegal!”

输入格式:
矩阵的输入采用三元组表示,先A后B。对每个矩阵:

第1行,3个整数N、M、t,用空格分隔,分别表示矩阵的行数、列数和非0数据项数,10≤N、M≤50000,t≤min(N,M).

第2至t+1行,每行3个整数r、c、v,用空格分隔,表示矩阵r行c列的位置是非0数据项v, v在32位有符号整型范围内。三元组默认按行列排序。

输出格式:
矩阵A+B,采用三元组表示,默认按行列排序,非零项也在32位有符号整型范围内。

输入样例:
10 10 3
2 2 2
5 5 5
10 10 20
10 10 2
2 2 1
6 6 6
输出样例:
10 10 4
2 2 3
5 5 5
6 6 6
10 10 20
数据结构第二次实验题解_第2张图片
拿到这个稀疏矩阵之和的题目时,我们早就知道应该用三元组来保存稀疏矩阵中的非零元素。
我自己的三元组结构体如下:

typedef struct{
   
  int r; // 行号
  int c; // 列号
  int d; // 元素值
}TupNode; // 三元组定义
typedef struct{
   
  int rows; // 行数值
  int cols; // 列数值
  int nums; // 非零元素个数
TupNode data[50000];
}TSMatrix; // 三元组顺序表定义

第一个结构体是三元组的结点,第二个结构体是三元组表示的稀疏矩阵。

在计算稀疏矩阵的和时,我们需要考虑下面这个问题:如何保持矩阵的有序性?如何保持三元组的有序性?
我们知道矩阵是有行标和列标的,通常情况下我们以行标优先表示矩阵元素,然后是列标。那么我们在相加两个矩阵后(假设可以相加)输出的三元组也应该遵循这个原则。

#include
#include
using namespace std;

typedef struct{
   
  int r; // 行号
  int c; // 列号
  int d; // 元素值
}TupNode; // 三元组定义

typedef struct{
   
 int rows; // 行数值
 int cols; // 列数值
 int nums; // 非零元素个数
TupNode data[50000];
}TSMatrix; // 三元组顺序表定义

/*------------------------求c=a+b----------------------*/
 bool matrix_add(TSMatrix a, TSMatrix b, TSMatrix &c) // 引用类型形参c
{
   
 int i = 0; // a中非零元素个数索引
 int j = 0; // b中非零元素个数索引
 int k = 0; // c中非零元素个数
  int v;

 if(a.rows != b.rows || a.cols != b.cols) // 行数或列数不等时不能进行相加运算
   return false;
 // c的行列数与a的相同
 c.rows = a.rows;    
 c.cols = a.cols;
 while(i < a.nums && j < b.nums) // 处理a和b中的元素
{
   
    if(a.

你可能感兴趣的:(数据结构第二次实验题解)