一维数组是数组中最简单的,这里的一维是指元素的下标只有一个。
在这里,数组的下标从零开始。
要说的很少,主要在实践中掌握,先看几个题吧。
问题一: 顺序查找
题目描述
从输入的n个整数中查找给定的SearchNum(若存在必唯一)。如果找到,输出SearchNum的位置(从0开始数);如果没有找到,输出“Not Found”。
输入
有两行。第1行是两个正整数n(n≤20)和SearchNum。第2行是n个整数,数字均不超过基本整型,其间以空格分隔。
输出
仅一行。如果找到,输出SearchNum的位置(从0开始数);如果没有找到,输出“Not Found”。
样例输入
5 7 3 5 7 1 9
样例输出
2
AC代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int a[25],n,m,flag=0,d; // 由于n<=20,这里数组容量大于20即可
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>a[i]; //输入数组元素
if(a[i]==m){
d=i; //记录位置
flag=1; //代表找到了
}
}
if(flag==1){
cout<<d<<"\n";
}else {
cout<<"Not Found"<<"\n";
}
return 0;
}
一维数组的一个主要作用是排序
问题 二: 军训排队
题目描述
又是一年开学季,大一新生连续三天报到结束后立即开始了他们期待已久的军训生活。军训中,教官按照同学们的身高从低到高给大家排好了队形,但是一周后又来了一名新同学(由于特殊原因,报到晚了),按照现在的队形,他应该站在什么位置呢?请你编程帮帮他!
输入
有三行。第1行是一个整数n(1≤n≤1000),表示有n位同学从低到高排好了队。第2行有n个整数,分别表示有序队形中的n位同学的身高。第3行是一个整数,表示新来的同学的身高。
输出
仅一行,n个整数,表示新同学加入后的新队形。
样例输入
10 153 155 159 161 163 165 167 169 170 172 168
样例输出
153 155 159 161 163 165 167 168 169 170 172
AC代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int a[1010],n,x;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
cin>>x;
a[n]=x; //数组下标从零开始,所以令数组a[n]为x的值,然后从小到大排序这n+1个数即可
for(int i=0;i<=n;i++){ //冒泡排序
for(int j=i+1;j<=n;j++){
if(a[i]>a[j]){
swap(a[i],a[j]); //交换两者的值
}
}
}
//也可以使用sort函数,这里主要为了熟悉冒泡排序这种排序方法
for(int i=0;i<=n;i++){
cout<<a[i]<<" ";
}
return 0;
}
问题 三: 选总统
题目描述
小明想当丑国的总统,丑国大选是按各州的投票结果来确定最终的结果。如果得到超过一半的州的支持就可以当选。而每个州的投票结果又是由该州选民投票产生的,如果某个州超过一半的选民支持小明,则他将赢得该州的支持。现在给出每个州的选民人数,请问小明至少需要赢得多少选民的支持才能当选?
输入
输入有两行。第一行是一个整数N(1<=N<=101),表示丑国的州数。第二行包括N个正整数,分别表示每个州的选民数,每个州的选民数不超过100。
输出
仅一行,表示小明至少需要赢得支持的选民数。
样例输入
3 5 7 5
样例输出
6
AC代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,a[110],m,sum=0;
cin>>n;
m=n/2+1; //当选所需的最少州数
for(int i=0;i<n;i++){
cin>>a[i];
}
sort(a,a+n); //默认从小到大排序
for(int i=0;i<m;i++){ //由于已经排好序了,所以接下来加起来的人数就是至少需要的人数
sum+=a[i]/2+1;
}
cout<<sum<<"\n";
return 0;
}
问题 四: 出发能量
题目描述
机器人比赛场地有 N个格子依次排开,机器人要从第 1个格子走过第 N个格子。每一个格子里面都有一个能量值,有的为正能量,有的为负能量。正能量,表示机器人可以得到这个能量,负能量,表示机器人要失去这么多能量。在任何格子中,机器人的能量都不能小于 0。一旦机器人的能量小于 0,任务就失败了。
为了完成任务,机器人出发时,至少需要携带多少能量?
输入
共两行。
第一行一个整数N,表示有N个格子。
第二行N个整数,表示格子里面的能量值。
输出
一个整数,表示机器人出发时至少需要携带的能量值。
样例输入
5 1 -3 -1 3 -2
样例输出
3
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+7;
int a[N]; //在主函数外面数组可以开的更大些
int main(){
int n,t=0,min=0; //min代表数组从前向后依次相加过程中的最小值
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
t+=a[i];
if(t<min){
min=t;
}
}
cout<<-min<<"\n"; //出发能量与min相加为零就能完成任务,即为-min
return 0;
}
问题 五: 顺不顺
题目描述
小明5岁了。他从一堆数字卡片中选出了4张卡片:5、7、6、8。他摆布了一阵这些卡片后,发现它们可以排成比较顺的序列:5、6、7、8。他同样拿了另4张卡片:5、7、1、2,可是怎么也排不成“顺”的序列。原来,小明的所谓“顺”序列是我们所知道的步长为1的等差数列!小明一边拿起一堆数字卡片,一边就在摆布它们,尝试着让它们“顺”起来,可总是有些“顺”,有些不“顺”。请你帮助小明来判断对于给定的一堆数字,能“顺”还是不能“顺”。
输入
有两行。第一行是一个整数n,表示卡片数量(1<= n<=1000)。
第二行有n张卡片数字(不大于1000的正整数)。
输出
给定的卡片数字能顺,就输出“Yes”,否则就输出“No”。
样例输入
5 8 4 7 6 5
样例输出
Yes
AC代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,a[1010],flag=0; //flag为0表示可以
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
sort(a,a+n); //从小到大排序
for(int i=0;i<n-1;i++){ //由于要比较a[i+1]-a[i]等不等于1,所以需要i<n-1
if((a[i+1]-a[i])!=1){
flag=1; //当找到不符合条件的一组时,让flag=1,退出循环
break;
}
}
if(flag==0){
cout<<"Yes"<<"\n";
}else {
cout<<"No"<<"\n";
}
return 0;
}