一维数组进阶
一、春游(统计编号)
题目描述
老师带领同学们春游。已知班上有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;
}
写在最后
生活不易,泰泰叹气,点点关注,球球了