一本通 1.5.1 一维数组

2034:【例5.1】反序输出

【题目描述】

输入n个数,要求程序按输入时的逆序把这n个数打印出来,已知整数不超过100个。也就是说,按输入相反顺序打印这n个数。

【题目分析】 

#include<bits/stdc++.h>
using namespace std;

int main(){
	int a[105];
	int cnt=0;
	while(cin>>a[cnt]) cnt++;
	for(int i=cnt-1;i>=0;i--){
		cout<<a[i]<<" ";
	}
    return 0;
}

2035:【例5.2】平移数据

【题目描述】

将a数组中第一个元素移到数组末尾,其余数据依次往前平移一个位置。

【题目分析】 

#include<bits/stdc++.h>
using namespace std;

int main() {
	int n, a[10005];
	cin >> n;
	cin >> a[n];
	for (int i = 1; i < n; i++) cin >> a[i];
	for (int i = 1; i <= n; i++) {
		cout << a[i] << " ";
	}
	return 0;
}

2036:【例5.3】开关门

【题目描述】

宾馆里有n(2≤n≤1000)个房间,从1∼n编号。第一个服务员把所有的房间门都打开了,第二个服务员把所有编号是2的倍数的房间“相反处理”,第三个服务员把所有编号是3的倍数的房间作“相反处理”…,以后每个服务员都是如此。)当第n个服务员来过后,哪几扇门是打开的。(所谓“相反处理”是:原来开着的门关上,原来关上的门打开。

【题目分析】 

使用模拟的方法

#include<bits/stdc++.h>
using namespace std;

int main() {
	bool a[1005];
	int n;
	memset(a,0,sizeof(a));
	cin >> n;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			if (j % i == 0) a[j] = 1 - a[j];
		}
	}
	for (int i = 1; i <= n; i++) {
		if (a[i]) cout << i << " ";
	}
	return 0;
}

2037:【例5.4】约瑟夫问题

【题目描述】

N个人围成一圈,从第一个人开始报数,数到M的人出圈;再由下一个人开始报数,数到M的人出圈;…输出依次出圈的人的编号。

【题目分析】 

使用数组模拟链表操作

#include<bits/stdc++.h>
using namespace std;

int main() {
	int a[1000];
	int n, m;
	cin >> n >> m;
	//当前人指向后一个人
	for (int i = 1; i <= n; i++) {
		a[i] = i + 1;
	}
	a[n] = 1; //最后一个人指向第一个人

	//模拟过程
	int cnt = 1;
	int index = 1;
	while (cnt <= n) {
		for (int i = 1; i < m - 1; i++) {
			index = a[index];
		}
		cout << a[index] << " ";
		a[index] = a[a[index]];
		index=a[index];
		cnt++;
	}
	return 0;
}

2037:【例5.4】约瑟夫问题

【题目描述】

N个人围成一圈,从第一个人开始报数,数到M的人出圈;再由下一个人开始报数,数到M的人出圈;…输出依次出圈的人的编号。

【题目分析】 

使用数组模拟链表操作

#include<bits/stdc++.h>
using namespace std;

int main() {
	int a[1000];
	int n, m;
	cin >> n >> m;
	//当前人指向后一个人
	for (int i = 1; i <= n; i++) {
		a[i] = i + 1;
	}
	a[n] = 1; //最后一个人指向第一个人

	//模拟过程
	int cnt = 1;
	int index = 1;
	//移除人数共n人
	while (cnt <= n) {     
		//点名人数 达到m出列 
		for (int i = 1; i < m - 1; i++) { 
			index = a[index];
		}
		cout << a[index] << " ";
		//将前一个人指向后一个人 
		a[index] = a[a[index]]; 
		index=a[index];
		cnt++;  //计数加一 
	}
	return 0;
}

2038:【例5.5】最大数位置

【题目描述】

输入n个整数,存放在数组a[1]至a[n]中,输出最大数所在位置(n≤1000)。

【题目分析】 

#include<bits/stdc++.h>
using namespace std;

int main() {
	int n, a[1005];
	cin >> n;
	int maxn = 0, index = 0;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
		if (maxn < a[i]) {
			maxn = a[i], index = i;
		}
	}
	cout << index;
	return 0;
}

2039:【例5.6】冒泡排序

【题目描述】

编程输入n(1≤n≤20)个小于1000非负整数,然后自动按从大到小的顺序输出。(冒泡排序)

【题目分析】 

#include<bits/stdc++.h>
using namespace std;

int main() {
	int n, a[1005];
	cin >> n;

	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	for (int i = 1; i <= n - 1; i++) {
		int maxn = -1, index = 0;
		for (int j = i; j <= n; j++) {
			if (a[j] > maxn) {
				maxn = a[j];
				index = j;
			}
		}
		swap(a[i], a[index]);
	}
	for (int i = 1; i <= n; i++) {
		cout << a[i] << endl;
	}
	return 0;
}

2040:【例5.7】筛选法找质数

【题目描述】

用筛法求出n(2≤n≤1000)以内的全部质数

【题目分析】

方法1:朴素算法  O(n^2)/O(n*sqrt(n))

#include <bits/stdc++.h>

using namespace std;

bool check(int n) {
	if (n <= 1) return false;
	if (n == 2) return true;
	int m = sqrt(n);
	for (int i = 2; i <= m; i++) {
		if (n % i == 0) return false;
	}
	return true;
}
int main() {
	//input data
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		if (check(i)) cout << i << endl;
	}

	return 0;
}

方法2:埃氏筛     O(n*log(n))

#include<bits/stdc++.h>
using namespace std;

bool vis[1005];

int main() {
	int n;
	cin >> n;
	for (int i = 2; i <= n; i++) {
		if (!vis[i]) {
			for (int j = i * 2; j <= n; j += i) {
				vis[j] = true;
			}
		}
	}
	for (int i = 2; i <= n; i++) {
		if (!vis[i])cout << i << endl;

	}
	return 0;
}

方法3:线性筛 /欧拉筛    O(n)   方法 最小质因数 × 最大因数(非自己) = 这个合数

#include<bits/stdc++.h>
using namespace std;

bool isprime[1005];
int prime[1005];

int main() {
	int n;
	cin >> n;
	int cnt = 0;
	memset(isprime, 1, sizeof(isprime));
	for (int i = 2; i <= n; i++) {
		if (isprime[i])  prime[++cnt] = i;
		for (int j = 1; j <= cnt && i * prime[j] <= n; j++) {
			isprime[i * prime[j]] = false;
			if (i % prime[j] == 0) break;
		}
	}
	for (int i = 1; i <= cnt; i++) {
		cout << prime[i] << endl;
	}
	return 0;
}

1102:与指定数字相同的数的个数

【题目描述】

输出一个整数序列中与指定数字相同的数的个数。

【题目分析】

#include <bits/stdc++.h>

using namespace std;


int main() {
	//input data
	int n, a[105];
	cin >> n;

	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	int m, ans = 0;
	cin >> m;
	for (int i = 1; i <= n; i++) {
		if (a[i] == m) ans++;
	}
	cout << ans;
	return 0;
}

1103:陶陶摘苹果

【题目描述】

输出一个整数序列中与指定数字相同的数的个数。

【题目分析】

#include <bits/stdc++.h>

using namespace std;


int main() {
	//input data
	int a[11], m, ans = 0;
	for (int i = 1; i <= 10; i++) {
		cin >> a[i];
	}
	cin >> m;
	for (int i = 1; i <= 10; i++) {
		if (a[i] <= m + 30) ans++;
	}
	cout << ans;
	return 0;
}

1104:计算书费

【题目描述】

下面是一个图书的单价表:

计算概论 28.9元/本

数据结构与算法 32.7元/本

数字逻辑 45.6元/本

C++程序设计教程 78元/本

人工智能 35 元/本

计算机体系结构 86.2元/本

编译原理 27.8元/本

操作系统 43元/本

计算机网络 56元/本

JAVA程序设计 65元/本

给定每种图书购买的数量,编程计算应付的总费用。

【题目分析】

#include <bits/stdc++.h>

using namespace std;

double a[10] = {28.9, 32.7, 45.6, 78, 35, 86.2, 27.8, 43, 56, 65};
int main() {
	//input data
	int b[10];
	for (int i = 0; i < 10; i++) {
		cin >> b[i];
	}
	double sum = 0;
	for (int i = 0; i < 10; i++) {
		sum += a[i] * b[i];
	}
	printf("%.1lf", sum);
	return 0;
}

1105:数组逆序重存放

【题目描述】

将一个数组中的值按逆序重新存放。例如,原来的顺序为8,6,5,4,1。要求改为1,4,5,6,8

【题目分析】

#include<bits/stdc++.h>
using namespace std;
int n,a[105];
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=n;i>=1;i--)cout<<a[i]<<" ";//反向输出
    return 0;
}

1106:年龄与疾病

【题目描述】

某医院想统计一下某项疾病的获得与否与年龄是否有关,需要对以前的诊断记录进行整理,按照0-18、19-35、36-60、61以上(含61)四个年龄段统计的患病人数占总患病人数的比例。

【题目分析】

#include <cstdio>
#define N 100
int a[N];
int main() {
	int i, n;
	int b = 0, c = 0, d = 0, e = 0, s = 0;
	double r1, r2, r3, r4;
	scanf("%d", &n);
	for (i = 0; i < n; i++) {
		scanf("%d", &a[i]);
		s++;
		if (a[i] <= 18)
			b++;
		else if (a[i] <= 35)
			c++;
		else if (a[i] <= 60)
			d++;
		else
			e++;
	}
	r1 = (double)b / s;
	r2 = (double)c / s;
	r3 = (double)d / s;
	r4 = (double)e / s;
	printf("%.2lf%%\n%.2lf%%\n%.2lf%%\n%.2lf%%\n", r1 * 100, r2 * 100, r3 * 100, r4 * 100);
	return 0;
}

1107:校门外的树

【题目描述】

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

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

【题目分析】

#include<bits/stdc++.h>
using namespace std;

int main() {

	bool a[10001] = {};
	int l, m, mstart, mend, cnt = 0;
	cin >> l >> m;

	for (int i = 1; i <= m; i++) {
		cin >> mstart >> mend;
		for (int j = mstart; j <= mend; j++) {
			a[j] = 1;
		}
	}

	for (int i = 0; i <= l; i++) {
		if (a[i] == 0)cnt++;
	}
	cout << cnt;
	return 0;
}

优化方向:将区间按照起始时间进行排序,将有重叠的区间进行合并,将每一段没有重叠的区间进行减差+1进行求和sum,L-sum即为所求的数量。


1108:向量点积计算

【题目描述】

【题目分析】

#include<bits/stdc++.h>

using namespace std;

int main() {
	int n, x;
	int sum = 0;
	cin >> n;
	int a[1001];
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	for (int i = 1; i <= n; i++) {
		cin >> x;
		sum += a[i] * x;
	}
	cout << sum << endl;
	return 0;
}

1109:开关灯

【题目描述】

假设有N盏灯(N为不大于5000的正整数),从1到N按顺序依次编号,初始时全部处于开启状态;有M个人(M为不大于N的正整数)也从1到M依次编号。

第一个人(1号)将灯全部关闭,第二个人(2号)将编号为2的倍数的灯打开,第三个人(3号)将编号为3的倍数的灯做相反处理(即将打开的灯关闭,将关闭的灯打开)。依照编号递增顺序,以后的人都和3号一样,将凡是自己编号倍数的灯做相反处理。

请问:当第M个人操作之后,哪几盏灯是关闭的,按从小到大输出其编号,其间用逗号间隔。

【题目分析】

#include<bits/stdc++.h>

using namespace std;

int main() {
	bool d[5001] = {};
	int n, m;
	cin >> n >> m;

	for (int i = 1; i <= m; i++) {
		for (int j = 1; j <= n; j++) {
			if (j % i == 0) d[j] = 1 - d[j];
		}
	}

	bool flag = false;
	for (int i = 1; i <= n; i++) {
		if (!flag && d[i]) {
			cout << i;
			flag = true;
		} else if (d[i])
			cout << "," << i;
	}

	return 0;
}

1110:查找特定的值

【题目描述】

   在一个序列(下标从1开始)中查找一个给定的值,输出第一次出现的位置。

【题目分析】

#include<bits/stdc++.h>

using namespace std;

int main() {
	int n, m;
	int a[10001] = {};
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	cin >> m;

	int temp = 0;
	for (int i = 1; i <= n; i++) {
		if (m == a[i]) {
			temp = i;
			break;
		}
	}
	if (temp == 0)cout << -1;
	else   cout << temp;


	return 0;
}


1111:不高兴的津津

【题目描述】

津津上初中了。妈妈认为津津应该更加用功学习,所以津津除了上学之外,还要参加妈妈为她报名的各科复习班。另外每周妈妈还会送她去学习朗诵、舞蹈和钢琴。但是津津如果一天上课超过八个小时就会不高兴,而且上得越久就会越不高兴。假设津津不会因为其它事不高兴,并且她的不高兴不会持续到第二天。请你帮忙检查一下津津下周的日程安排,看看下周她会不会不高兴;如果会的话,哪天最不高兴。

【题目分析】

#include<bits/stdc++.h>

using namespace std;

int main(){
	int a[8],x,y;
	for(int i=1;i<=7;i++){
		cin>>x>>y;
		a[i]=x+y;
	}
	int max=-1,temp=0;
	for(int i=1;i<=7;i++){
		if(max<a[i]){
			max=a[i];
			temp=i;
		}
	}
	if(max<=8)cout<<0;
	else cout<<temp;


	return 0;
}

1112:最大值和最小值的差

【题目描述】

输出一个整数序列中最大的数和最小的数的差。

【题目分析】

#include<bits/stdc++.h>

using namespace std;

int main() {
	int m, a[10001] = {};
	cin >> m;
	for (int i = 1; i <= m; i++) {
		cin >> a[i];
	}
	int max = -1, min = 10001;
	for (int i = 1; i <= m; i++) {
		if (a[i] > max)max = a[i];
		if (a[i] < min)min = a[i];
	}
	cout << max - min;

	return 0;
}

1113:不与最大数相同的数字之和

【题目描述】

输出一个整数数列中不与最大数相同的数字之和。

【题目分析】

#include<bits/stdc++.h>

using namespace std;

int main() {
	int n;
	int a[101] = {};

	cin >> n;
	int max = -1000001, sum = 0;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
		if (max < a[i]) max = a[i];
		sum += a[i];
	}
	int cnt = 0;
	for (int i = 1; i <= n; i++) {
		if (a[i] == max) sum -= max;
	}
	cout << sum;
	return 0;
}

1114:白细胞计数

【题目描述】

医院采样了某临床病例治疗期间的白细胞数量样本n份,用于分析某种新抗生素对该病例的治疗效果。为了降低分析误差,要先从这n份样本中去除一个数值最大的样本和一个数值最小的样本,然后将剩余n−2个有效样本的平均值作为分析指标。同时,为了观察该抗生素的疗效是否稳定,还要给出该平均值的误差,即所有有效样本(即不包括已扣除的两个样本)与该平均值之差的绝对值的最大值。

现在请你编写程序,根据提供的n个样本值,计算出该病例的平均白细胞数量和对应的误差。

【题目分析】

#include<bits/stdc++.h>

using namespace std;

int main() {
	int n;
	double a[301] = {}, avg = 0, sum = 0;
	cin >> n;
	double maxa = -1, mina = 999999;
	int maxi = 0, mini = 0;
	for (int i = 1; i <= n; i++) {
		scanf("%lf", &a[i]);
		if (maxa < a[i]) {
			maxa = a[i];
			maxi = i;
		}
		if (mina > a[i]) {
			mina = a[i];
			mini = i;
		}
		sum += a[i];
	}
	avg = (sum - maxa - mina) / (n - 2);
	double max_avg = -1;
	for (int i = 1; i <= n; i++) {
		if (i != mini && i != maxi)
			max_avg = max(max_avg, fabs(a[i] - avg));
	}
	printf("%.2lf %.2lf", avg, max_avg);
	return 0;
}


1115:直方图

【题目描述】

【题目分析】

#include<bits/stdc++.h>

using namespace std;

int main() {
	int n, a[10001];
	int b[10001] = {}, temp;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	sort(a + 1, a + n + 1);
	temp = a[n];
//	cout<<"temp:"<<temp;
	for (int i = 1; i <= n; i++) {
		b[a[i]]++;
	}
	for (int i = 0; i <= temp; i++) {
		cout << b[i] << endl;
	}
	return 0;
}

1116:最长平台

【题目描述】

已知一个已经从小到大排序的数组,这个数组的一个平台(Plateau)就是连续的一串值相同的元素,并且这一串元素不能再延伸。例如,在 1,2,2,3,3,3,4,5,5,61,2-2,3-3-3,4,5-5,6都是平台。试编写一个程序,接收一个数组,把这个数组最长的平台找出来。在上面的例子中3-3-3就是最长的平台。

【题目分析】

#include<bits/stdc++.h>

using namespace std;

int main() {
	int n, a[100001] = {}, x = 1, max = -1;
	cin >> n;

	for (int i = 1; i <= n; i++) { //读入n个数据
		cin >> a[i];
		if (a[i] == a[i - 1])x++;
		else x = 1;
		if (max < x)max = x;
	}
	cout << max;
	return 0;
}

1117:整数去重

【题目描述】

给定含有n个整数的序列,要求对这个序列进行去重操作。所谓去重,是指对这个序列中每个重复出现的数,只保留该数第一次出现的位置,删除其余位置。

【题目分析】

#include<bits/stdc++.h>

using namespace std;

int main() {
	int n, a[20001] = {}, b[5001] = {};
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	for (int i = 1; i <= n; i++) {
		b[a[i]]++;
	}
	for (int i = 1; i <= n; i++) {
		if (b[a[i]] != 0 && b[a[i]] != -1) {
			cout << a[i] << " ";
			b[a[i]] = -1;
		}
	}
	return 0;
}

1118:铺地毯

【题目描述】

【题目分析】

#include<bits/stdc++.h>

using namespace std;

int main() {
	int n, x, y, a[10001][5] = {};
	cin >> n;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= 4; j++) {
			cin >> a[i][j];
		}
	}
	cin >> x >> y;
	int temp = -1;
	for (int i = n; i >= 1; i--) {
		if (x >= a[i][1] && x <= (a[i][1] + a[i][3]) && y >= a[i][2] && y <= (a[i][2] + a[i][4])) {
			temp = i;
			break;
		}
	}
	cout << temp;
	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值