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,6
中1,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;
}