线性表(一)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、 定义
  • 二、线性表的两种实现方式
    • 1.顺序表示
    • 2.链表


前言

线性表是一种最基本、最简单的数据结构。数据元素之间仅具有单一的前驱和后继关系。

一、 定义

线性表是n个数据特性相同的元素的组成有限序列,是最基本且常用的一种线性结构(线性表,栈,队列,串和数组都是线性结构),同时也是其他数据结构的基础。

对于非空的线性表或者线性结构的特点:

(1)存在唯一的一个被称作“第一个”的数据元素;

(2)存在唯一的一个被称作“最后一个”的数据元素;

(3)除第一个外,结构中的每个数据元素均只有一个前驱;

(4)除最后一个外,结构中的每个数据元素均只有一个后继;

二、线性表的两种实现方式

1.顺序表示

概念:用一组地址连续的存储单元依次存储线性表的数据元素,这种存储结构的线性表称为顺序表。

特点:逻辑上相邻的数据元素,物理次序也是相邻的。

只要确定好了存储线性表的起始位置,线性表中任一数据元素都可以随机存取,所以线性表的顺序存储结构是一种随机存取的储存结构,因为高级语言中的数组类型也是有随机存取的特性,所以通常我们都使用数组来描述数据结构中的顺序储存结构,用动态分配的一维数组表示线性表。

2.链表

概念:用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的),包括数据域和指针域,数据域存数据,指针域指示其后继的信息。


codeforces题目链接:
https://codeforces.com/problemset/problem/1462/D

题解:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const double esp = 1e-6;
const double PI = acos(-1);
const int N = 1e5 + 5;

int n,m,x; 
int a[N]; 
string s;
void solve(){
     	
	scanf("%d",&n);
	int maxx = 0,sum = 0;
	for(int i=1;i<=n;i++){
     
		scanf("%d",&x);
		a[i]=x;
		sum += x;
		maxx = max(maxx, x);
	}
	for(int i=maxx;i<=sum;i++){
     
		if(sum%i==0){
     
			bool flag = true;
			for(int j=1;j<=n;j++){
     
				if(a[j]<i){
     
					int summ = 0;
					for(int k=j;k<=n;k++,j++){
     
						summ+=a[k];
						if(summ == i) break;
						if(summ > i){
     
							flag = false;
							break;
						} 
					}
				} 
			}
			if(flag){
     
				printf("%d\n",n-sum/i);
				return;
			}
		}
	}
}

int main(){
     
	int t = 1;
	scanf("%d",&t);
	while(t--){
     
		solve();
	}
	return 0;
}

你可能感兴趣的:(数据结构)