本章讲的是C++语言中最重要的数组,以下附上一道例题
https://www.luogu.org/problemnew/show/P2141#sub
让我们先来梳理一下题意:将给定的数中两个不同的数之和如果等于另一个数,那么就符合标准,最后算出到底有几个这样的另一个数
那么我们会发现,我们需要保存n个数,但是n是需要输入的,数量不确定,不能用a,b,c这样去定义。所以我们要用到数组,以下介绍一下数组
一.一维数组
定义模板为: 类型名 数组名[数组最大个数]
如:int a[100001]
定义一个有100001个位置的int类型的a数组
那么有几点注意事项:
1.数组名与类型名这些与变量名是差不多的;
2.[]里面的数组最大个数是指要存进里面的数字的个数最多是多少,必须是正整数;
3.[]里面的数如果太大,会申请的空间太大,不符合要求,会整题没分;如果太小,需要申请的空间在里面容不下,就会越界;
示意图:
a[0]
a[1]
a[2]
a[3]
a[4]
a[5]
a[6]
a[7]
a[8]
a[9]
每个数组都有这样一个空间,也有各自的下标。
应用模板为:数组名[下标]
如:a[1]=b[1]
将b[1]的值赋给a数组1位置
如果你要调用a[0]里面的数的话,就直接这样写就好了
初始化模板:数组名[数组最大个数]={数字(第一个位置就是下标为0时候的数字)}
如:a[3]={1,2,3}
a[1]=1 a[2]=2 a[3]=3
那么现在那道题可以用这样的步骤:
PS:这道题用的是一种比较特别的方法,类似于桶排,以后讲到排序时会讲。
1.设置两个桶各自来体现数列之中两个数的和与数列中的数是否存在;
2.将数列输入,并将它们装进桶里,标记为已知,之后双重循环枚举标记两数之和为已知;
3.最后进行循环比较,如果某数在两个不同类型的桶中都有标记的话,就说明该数符合要求,计数器(设置一个变量为计数器)加一
代码如下:
#include<iostream>
using namespace std;
int a[100001],s=0,n;//a数组是要求输入的数列,n是要求输入的数列长度,s为计数器,记得归零,不然不知从哪加
bool b[100001]={0},c[100001]={0};//b数组标记两数之和是否存在,存在值为1,如:下标为1的数组值为1,则说明数列之中有两数之和为1;c数组则是标记数列中的数是否存在
int main(){
cin>>n;
for(long long i=0;i<n;i++){
cin>>a[i];
c[a[i]]=1;
}//输入并标记
for(long long i=0;i<n;i++){
for(long long j=i+1;j<n;j++){
b[a[i]+a[j]]=1;
}
}//双重循环,将所有数的和枚举并标记,不懂可以看我上一篇博客
for(long long i=0;i<100000;i++){
//记得不能在这个位置写s=0,因为它没循环一次,就会归一次0,那之前记的数就作废了
if(c[i]==1&&b[i]==1){
s++;
}
}// 循环进行判断,看有没有数符合两个特征,枚举到100000是因为数据范围中写每个数的大小不超过10000,所以两数之和不会超过20000,但保险起见,枚举到100000
cout<<s<<endl;
return 0;
}//其他的皆是基础结构,不懂得可以看我之前的博客
那么继续来讲一下二维数组
应用模板为:数组名[下标][下标]
PS:这个数组所占空间为两个下标相乘之积,其他与一维数组相同。
给大家推荐几道题
https://www.luogu.org/problemnew/show/P1567
https://www.luogu.org/problemnew/show/P1149
https://www.luogu.org/problemnew/show/P1217
https://www.luogu.org/problemnew/show/P1579
https://www.luogu.org/problemnew/show/P1307
————————————————
版权声明:本文为CSDN博主「时光无印,岁月无痕」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41712886/article/details/82951831