一维数组进阶

一维数组进阶

一、春游(统计编号)

题目描述

老师带领同学们春游。已知班上有N位同学,每位同学有从0到N-1的唯一编号。到了集合时间,老师确认是否所有同学都到达了集合地点,就让同学们报出自己的编号。到达的同学都会报出的编号,不会报出别人的编号,但有的同学很顽皮,会多次报出。你能帮老师找出有哪些同学没有到达吗?
输入描述:
输入包含2行。第一行包含两个整数N和M,表示班级有N位同学,同学们共有M次报出编号。约定2≤N, M ≤1000。
第二行包含M个整数,分别为M次报出的编号。约定所有编号都在合理范围内。
输出描述:
输出一行。如果所有同学都到达,则输出N;否则由小到大输出所有未到达的同学。

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
    int n,m,x,cnt=0;
    cin>>n>>m;
    int a[n];
    memset(a,0,sizeof(a));
    for(int i=0;i<m;i++)
    {
        cin>>x;
        a[x]++;//做盒子,有数的加一,没数的仍为0
    }
    for(int i=0;i<n;i++)
    {
        if(a[i]==0)
        {
            cout<<i<<" ";
            cnt++;
        }
    }
    if(cnt==0)//0的就没来
    {
        cout<<n<<endl;
    }
    return 0;
}

二、统计数据

题目描述

乎乎得到了一组整数,他想知道其中每个整数出现的次数,请帮他编程实现。
输入描述:
输入两行,第一行,为一个整数n,范围为(3~1000),
第二行,输入n个整数,每个整数的范围为(1~10000),用空格隔开。
输出描述:
输出为n行,按整数大小从高到低输出其出现的次数,每行输出两个整数,为出现的整数和对应出现的次数,用“-”线隔开。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,m;
    int a[10001];
    cin>>n;
    memset(a,0,sizeof(a));
    for(int i=1;i<=n;i++)
    {
        cin>>m;
        a[m]++;
    }
    for(int i=10000;i>=1;i--)
    {
        if(a[i]!=0)
        {
            cout<<i<<"-"<<a[i]<<endl;
        } 
    }
    
    return 0;
}

和上一个题其实差不多,主要是为了记录一下memset初始化的写法。

三、出现次数最多的整数

题目描述

本题要求统计一个整型序列中出现次数最多的整数及其出现次数。
输入描述:
输入分两行,第一行中给出序列中整数个数N(0<N≤1000),第二行输入N个整数(每个数的范围为1~1000)。数字间以空格分隔。
输出描述:
在一行中输出出现次数最多的整数及其出现次数,数字间以空格分隔。题目保证这样的数字是唯一的。

#include<stdio.h>
int main()
{
    int i,n,str[1000];
    scanf("%d",&n);
    for(i=0;i<n;i++)
        scanf("%d",&str[i]);
    int j,num,count,max=-1,maxnum;
    for(i=0;i<n;i++)
    {
        num=str[i];//一个数一个数统计
        count=0;
        for(j=0;j<n;j++)   //此循环统计值为num的数有多少个
        {
            if(str[j]==num)
            count++;
        }
        if(count>max)    //记录最大的,来回换
        {
            max=count;
            maxnum=str[i];
        }
    }
    printf("%d %d",maxnum,max);
    return 0;
}

四、去重并排序

题目描述

给定一个整数序列,KiKi想把其中的重复的整数去掉,并将去重后的序列从小到大排序输出。
输入描述:
第一行,输入一个整数n,表示序列有n个整数。
第二行输入n个整数(每个整数大于等于1,小于等于1000),整数之间用空格分隔。
输出描述:
去重并且从小到大排列的整数序列,整数之间用空格分隔。

#include<stdio.h>
int main()
{
    int n;
    scanf("%d", &n);
    int arr[1001] = { 0 };
    int i = 0;
    int m = 0;
    for (i = 0; i < n; i++)
    {
        scanf("%d", &m);
        arr[m] = m;//可以存数又可以去重。
    }
 
    for (i = 0; i < 1001; i++) 
    {
        if (arr[i] != 0) 
        {
            printf("%d ", arr[i]);
        }
    }
    return 0;
}

五、二分查找

题目描述

输入n个整数序列,然后输入整数m,判断m是否存在于已经输入的n个整数,如果存在输出“YES”,否则输出"NO",下列程序中的函数binarySearch为采用二分查找的方式进行查找,请补充完整。
二分查找过程:首先,把输入的n个数的序列按升序排列,将n个数中间位置的数字与查找的数字m比较,如果两者相等,则查找成功;否则利用中间位置数字将表分成前、后两个子序列,如果中间位置的数字大于查找的数字m,则进一步查找前一子序列,否则进一步查找后一序列。重复以上过程,直到找到满足条件的数字,使查找成功,或直到子序列不存在为止,此时查找不成功。
#include
#include
#include
using namespace std;
const int N = 1e3 + 5;
int n, m;
int a[N];
void binarySearch(int m)
{
//left:序列的左端位置,right:序列的右端位置
int left = 0, right = n - 1;
int mid; //序列的中间位置
/****** 请补充以下的while循环******/
while(left <= right)
{
需要补充的部分
}
cout << “NO” << endl;
}
int main()
{
cin >> n;
for(int i = 0 ; i < n ; i++)
{
cin >> a[i];
}
sort(a, a+n); //从小大进行排序
cin >> m;
binarySearch(m);
return 0;
}
输入描述:
共三行,
第一行,一个整数n( 1 < n <1000),
第二行,n个整数,用空格分隔,表示待查找的序列。
第三行,一个整数m, 表示要查找的数字。
输出描述:
一行,判断m是否存在于已经输入的n个整数,如果存在输出“YES”,否则输出"NO"。

#include <iostream>
using namespace std;

int main() {
    int n, m;
    cin >> n;
    int a[n];
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }
    cin >> m;
    bool flag = false;
    for (int i = 0; i < n; i++) {
        if (a[i] == m) {
            flag = true;
            break;
        }
    }
    if (flag) {
        cout << "YES" << endl;
    } else {
        cout << "NO" << endl;
    }
    return 0;
}

六、开关门

题目描述

宾馆里有n个房间,从1∼n编了号,开始都是关闭的。第一个服务员把所有的房间门都打开了,第二个服务员把所有编号是2的倍数的房间“相反处理”,第三个服务员把所有编号是3的倍数的房间作“相反处理”…,以后每个服务员都是如此。当第n个服务员来过后,哪几扇门是打开的。(所谓“相反处理”是:原来开着的门关上,原来关上的门打开。)
输入描述:
房间数n(2≤n≤1000)。
输出描述:
一行,由小到大的打开门的房间序号,各序号之间用一个空格隔开。

#include <iostream> 
using namespace std; 
int main(){ 
	int n;
	int a[1001]={0}; // 0代表关着 1代表开。 
	cin >> n; 
	for(int i=1;i<=n;i++){
		for(int j=1;j<=i;j++){
			if(i % j == 0){
				if(a[i] == 0){
					a[i] = 1; //开 
				}else{
					a[i] = 0; // 关 
				}
			}
		}
	}
	for(int i=0;i<=n;i++){
		if(a[i] == 1){
			cout<<i<<" ";
		}
	}
	return 0;
} 

校门外的树

题目描述

某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。

由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。

输入描述:
第一行有两个整数:L(1 <= L <= 10000)和 M(1 <= M <= 100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。接下来的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。
输出描述:
包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。

# include <stdio.h>
int main ()
{
	int l,m;
	int k=0;
	int arr[10001]={0};      //初始化都为0
	scanf("%d %d",&l,&m);
	for(int i=0;i<m;i++)
	{
	    int x,y;
		scanf("%d %d",&x,&y);
		for(int i=x;i<=y;i++)
		{
			arr[i]=-1;      //将移走树木的点变为-1
		}
	}
	for(int i=0;i<=l;i++)
	{
		if(arr[i]!=-1)
		{
			k++;          //不是-1的点累加,即为剩余树木的数量
		}
	}
	printf("%d",k);
	return 0;
}

写在最后
生活不易,泰泰叹气,点点关注,球球了

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值