moran2466696920 2023-09-20 00:01 采纳率: 20%
浏览 80
已结题

请问这个郊游应该怎么写

郊游

题目描述

摩乐乐和他的朋友想出去郊游,他们现在有n座山(排成一行)可以选择,并且每座山的山顶都有独一无二的风景。当爬上某座山的山顶时,除了可以欣赏这座山本身的风景,还可以欣赏其他山顶的风景(只能看到比这座山高的风景,且因为视野影响可能只能看到高度单调递增的地方)。现在给出n座山的高度,请计算出爬上每座山的可以欣赏的风景的数量供摩乐乐和他的朋友选择。

输入格式

第一行 一个整数n

第二行 n个整数 a1…n表示每座山的高度

输出格式

一行n个整数 表示每座山可以看到的风景数量

数据规模
1<=n<=1e5
1<=ai<=1e9
输入样例

6
5 4 4 1 3 4

输出样例

1 2 2 5 4 2

样例解释

每座山可以看到的风景:
1: 1
2: 1 2
3: 1 3
4: 1 3 4 5 6
5: 1 3 5 6
6: 1 6

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-09-20 02:05
    关注

    【以下回答由 GPT 生成】

    解决方案

    我们可以使用一个栈来解决这个问题。遍历每座山的高度,然后将高度依次入栈。在入栈之前,需要判断当前山的高度是否大于栈顶的山高度,如果是,则将栈中所有高度小于当前山高度的山弹出,并且记录弹出山的风景数量。

    具体步骤如下:

    1. 初始化一个栈,用于存储山的高度和对应的风景数量。
    2. 遍历每座山的高度,从第一座山开始。
    3. 判断当前山的高度是否大于栈顶的山高度:
    4. 如果是,则将栈中所有高度小于当前山高度的山弹出,并且记录弹出山的风景数量。
    5. 如果不是,则将当前山的高度和风景数量入栈。
    6. 输出每座山对应的风景数量。

    下面是使用C语言实现的代码:

    #include <stdio.h>
    #define MAX_SIZE 100000
    
    typedef struct {
        int height;     // 山的高度
        int scenery;    // 可看到的风景数量
    } Mountain;
    
    typedef struct {
        Mountain data[MAX_SIZE];
        int top;        // 栈顶指针
    } Stack;
    
    void initStack(Stack *s) {
        s->top = -1;
    }
    
    void push(Stack *s, Mountain m) {
        s->top++;
        s->data[s->top] = m;
    }
    
    Mountain pop(Stack *s) {
        Mountain m = s->data[s->top];
        s->top--;
        return m;
    }
    
    int main() {
        int n;
        scanf("%d", &n);
        Stack stack;
        initStack(&stack);
    
        for (int i = 0; i < n; i++) {
            Mountain m;
            scanf("%d", &m.height);
            m.scenery = 1;
    
            while (stack.top >= 0 && m.height >= stack.data[stack.top].height) {
                m.scenery += stack.data[stack.top].scenery;
                pop(&stack);
            }
    
            if (stack.top >= 0) {
                m.scenery++;    // 当前山除了能看到比它高的山外,还能看到当前出栈的山
            }
    
            push(&stack, m);
    
            printf("%d ", m.scenery);
        }
    
        return 0;
    }
    

    这段代码首先定义了两个结构体:Mountain 用于存储山的高度和对应的风景数量,Stack 用于实现栈的数据结构。

    然后定义了几个函数:initStack 用于初始化栈,push 用于入栈,pop 用于出栈。

    main 函数中,先读入山的个数 n,然后初始化栈,并通过循环遍历每座山的高度。

    在循环中,首先读入当前山的高度,并设置初始的风景数量为1。然后判断当前山的高度是否大于栈顶的山高度,如果是,则将栈中所有高度小于当前山高度的山弹出,并且累加风景数量。如果栈非空,还需要再加1,因为除了能看到比当前山高的山外,还能看到当前出栈的山。

    最后将当前山的高度和风景数量入栈,并输出风景数量。

    最终输出的就是每座山对应的风景数量。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 10月19日
  • 已采纳回答 10月11日
  • 创建了问题 9月20日

悬赏问题

  • ¥30 设计一个图形用户界面来控制你机械臂的运动
  • ¥30 3d打印机无法识别到SD卡,如何解决?(相关搜索:格式化)
  • ¥15 RPG游戏架构设计和开发方法
  • ¥15 python 计算股权结构
  • ¥30 为什么会失败呢,该如何调整
  • ¥15 前端返回pdf时不显示内容
  • ¥50 如何在不能联网影子模式下的电脑解决usb锁
  • ¥20 服务器redhat5.8网络问题
  • ¥15 如何利用c++ MFC绘制复杂网络多层图
  • ¥20 要做柴油机燃烧室优化 需要保持压缩比不变 请问怎么用AVL fire ESE软件里面的 compensation volume 来使用补偿体积来保持压缩比不变