C语言(3):一维数组

  一维数组是数组中最简单的,这里的一维是指元素的下标只有一个。

  在这里,数组的下标从零开始。

  要说的很少,主要在实践中掌握,先看几个题吧。

问题一: 顺序查找

题目描述

从输入的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;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值