MC0115数组稳定度 && MC0116水往低处流

本文介绍两道编程题的解决方案:一是求解数组删除一个元素后的最小不稳定度;二是模拟剧场入席过程,并统计每秒末不为空的行数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MC0115数组稳定度

题目

难度:青铜 时间限制:1秒 占用内存:128M

小码哥最近得到了一个长度为 n 的数组a_1,a_2,\cdots, a_n

我们令数组的不稳定度为:max_{i=1}^n a_i - \min_{i=1}^n a_i

即数组的不稳定度为数组中的最大值减去最小值。特别地,当数组长度为 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

钻仰弥坚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值