MC0115数组稳定度
题目
难度:青铜 时间限制:1秒 占用内存:128M
小码哥最近得到了一个长度为 n 的数组
我们令数组的不稳定度为:
即数组的不稳定度为数组中的最大值减去最小值。特别地,当数组长度为 1时,由于最大最小值相等,因此不稳定度为0。他想从数组中删除恰好一个元素,并最小化剩余 n-1个元素的不稳定度。请你帮助他计算一下这个最小可能的不稳定度值吧。
格式
输入格式:
第一行包含一个整数n(2≤n≤10^5),表示数组 a 中的元素个数。
第二行包含 n个整数a1,a2,⋯,an(1≤ai≤10^5),表示数组中的元素。
输出格式:
输出一个整数,代表从数组 a 中删除一个元素后的最小不稳定度值。
算法思想:
下面这段代码通过排序数组,并分别计算删除最大值和最小值后剩余 n-1 个元素的不稳定度,然后取最小值作为结果输出。
- 首先,读取输入的数组长度 n。
- 然后,使用循环读取数组的元素。
- 如果数组长度为 1,直接将不稳定度设为 0。
- 否则,对数组进行排序。
- 分别计算删除最大值和最小值后剩余 n-1 个元素的不稳定度。
- 取两种情况中的最小值作为结果,并输出。
代码
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int n,num;
int a[100001];
scanf("%d",&n);
for(int i=0;i<n;i++){
cin>>a[i];
}
if(n==1){
num=0;
}else{
sort(a,a+n);
if(a[n-1]-a[1]>a[n-2]-a[0]){
num=a[n-2]-a[0];
}else{
num=a[n-1]-a[1];
}
}
cout<<num;
return 0;
}
MC0116水往低处流
题目
M大剧场共有 n 行 n 列共n^2个座位。在表演开始前,会有n^2秒的入席时间。
每一秒剧场里将会发生如下变化:
1.已经坐在第 i 行第 j 列的观众将挪到第i行第 j+1 列(坐在第 i 行第 n 列的观众将挪到第 i+1 行第 1 列)。
2.如果有观众进入剧场,那么他将坐到第 1 行第 1 列的位置上,每一秒最多一个观众进场。
起始时剧场为空,剧场老板小码哥将给出观众的进场情况,他想请你算出每一秒末,有多少行不是空的。一行是空的当且仅当这一行所有座位都没有人。
格式
输入格式:
第一行输入一个正整数 n(n≤50)。
第二行输入一个长度为 n^2的01串,表示入席时间观众进场的情况。其中第 i 位为 1表示第 i 秒有人进入,为 0 表示第 i 秒没有人进入。
输出格式:
输出一行n^2个用空格分隔的数字,第 i 个数字表示第 i 秒末有多少行不为空。
算法思想:
要解决这个问题,我们需要模拟观众入场的过程,并在每一秒末统计每一行的观众数量。当每一秒有人进来和没人进来时分类讨论,注意讨论边界值的传递。这段代码的逻辑是在一个二维数组中,判断每个元素是否是其周围四个元素中的最大值。如果是,则计数器 b 自增 1,最后输出 b 的值。并且对数组边界进行了有效的检查,并且避免了不必要的检查。
代码:
#include<bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
int a[2002][2002] = {0}; // 初始化数组,并赋值为0,避免数组元素未初始化导致的随机值
// 读取二维数组的元素值
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
cin >> a[i][j];
}
}
int b = 0;
// 遍历二维数组内部元素
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
// 判断是否为局部最大值
if(a[i][j] >= a[i-1][j] && a[i][j] >= a[i][j-1] && a[i][j] >= a[i+1][j] && a[i][j] >= a[i][j+1]) {
b++;
}
}
}
cout << b;
return 0;
}