首页 > 其他分享 >蓝桥杯真题——good-sequence(C语言)

蓝桥杯真题——good-sequence(C语言)

时间:2024-11-10 19:17:27浏览次数:3  
标签:arr good sequence int 元素 蓝桥 索引 数组 stack

 问题描述

一个序列 [b1,b2,...,bm] 若对于 2≤i≤m 满足 bi≤b1 ,则称为好序列。

现在给定 [a1,a2,...,an] ,求对于该序列的每一个后缀 [ak,ak+1,...,an](1≤k≤n)最少能划分成多少个好序列。

输入格式

第一行包含一个整数 n ,表示数组 a 的长度。

第二行包含 nn 个整数 a1,a2,a3,...,an,两两之间以一个空格分隔。

输出格式

输出 n 行,第 i 行输出 k=i时的答案。

样例输入

6

1 1 4 5 1 4

样例输出 

3

3

2

1

2

1

样例解释

当 k=1 时, 可划分为: [[1,1],[4],[5,1,4]] 。

当 k=2 时, 可划分为: [[1],[4],[5,1,4]] 。

当 k=3 时, 可划分为: [[4],[5,1,4]] 。

当 k=4 时, 可划分为: [[5,1,4]] 。

当 k=5 时, 可划分为: [[1],[4]] 。

当 k=6 时, 可划分为: [[4]] 。

评测数据规模

对于所有评测数据, 1\leq n\leq _{10^{6}} 1\leq ai\leq _{10^{9}}

运行限制

语言最大运行时间最大运行内存
C2s256M

解法代码 

#include <stdio.h>
#include <stdlib.h>

#define N 1000010 // 定义数组的最大长度

int a[N], arr[N]; // a数组用于存储输入数据,arr数组用于存储结果
int stack[N]; // 使用数组来模拟栈,存储元素的索引
int stack_top = -1; // 栈顶指针,初始化为-1表示栈为空

int main() 
{
    int n = 0; // 定义变量n用于存储输入的元素个数
    scanf("%d", &n); // 从标准输入读取元素个数
    for (int i = 0; i < n; i++) 
    { 
        scanf("%d", &a[i]);// 循环读取n个元素到数组a中
    }

    /*
     * 从后往前遍历数组a,模拟deque的行为
     * 对于每个元素,找到其右边第一个比它大的元素的索引,并计算距离(长度+1)
     */
    for (int i = n - 1; i >= 0; i--) 
    {
        // 弹出栈顶元素,直到栈为空或栈顶元素对应的值大于当前元素的值
        while (stack_top >= 0 && a[stack[stack_top]] <= a[i]) 
        {
            stack_top--; // 栈顶指针下移,表示弹出栈顶元素
        }

        // 设置arr值
        // 如果栈不为空,则arr[i]为栈顶索引+1(表示长度)+1(因为要从1开始计数,如果要从0开始则去掉一个+1)
        // 如果栈为空,则arr[i]为1,表示当前元素右边没有比它大的元素
        if (stack_top >= 0) 
        {
            arr[i] = stack_top + 1 + 1; // 注意这里的+1+1,第一个+1是长度,第二个+1是因为从1开始计数
        }
        else 
        {
            arr[i] = 1;
        }

        // 将当前元素的索引压入栈中
        stack[++stack_top] = i; // 栈顶指针上移,并将当前元素的索引存入栈顶
    }

    /*
     * 输出arr数组中的值
     * 注意:此时arr数组中的索引对应的是原数组a中的索引(从0开始)
     * 如果需要从1开始输出索引对应的值,可以在打印时做一个简单的调整(例如,打印arr[i] + 1)
     * 但由于C语言习惯从0开始索引,这里直接输出即可
     */
    for (int i = 0; i < n; i++) {
        printf("%d\n", arr[i]); // 打印arr数组中的每个值
    }

    return 0; 
}

答案验证

标签:arr,good,sequence,int,元素,蓝桥,索引,数组,stack
From: https://blog.csdn.net/huc_error/article/details/143659952

相关文章

  • 备赛web蓝桥杯①
    数组常用函数//1.find()constarry1=[5,12,8,130,44];constfound=arry1.find(a=>a>10);//这一行使用了find方法,它是JavaScript数组对象的一个方法,用于找出第一个满足提供的测试函数的元素。//find()的箭头函数:变量名=>......
  • 蓝桥杯每日真题 - 第7天
    题目:(爬山)题目描述(X届C&C++B组X题)解题思路:前缀和构造:为了高效地计算子数组的和,我们可以先构造前缀和数组a,其中a[i]表示从第1个元素到第i个元素的和。这样,对于任意区间[i,j]的子数组和,可以通过a[j]-a[i-1]快速得到。枚举所有区间和:用双重循环枚举所有可......
  • 【蓝桥杯 2021 省 B2】特殊年份
    题目描述:今年是2021年,2021这个数字非常特殊,它的千位和十位相等,个位比百位大11,我们称满足这样条件的年份为特殊年份。输入55个年份,请计算这里面有多少个特殊年份。输入格式输入55行,每行一个44位十进制数(数值范围为10001000至99999999),表示一个年份。输出......
  • CF1270 Good Bye 2019
    Dashboard玩构造玩的,服了。A拥有最大牌的必胜。linkB若相邻的差\(\ge2\)则有解,否则根据变化连续性一定无解。linkC加两个数,第一个数为之前所有数的异或和。加进来之后异或为0。第二个数为加完第一个数之后的和。linkD考虑\(k=n-1\)时,分别询问除去每个数之后的第\(......
  • 基于蓝桥杯实验豆不够衍生出的【假装学习】方法
    前言首先是感谢两位大佬给的思路@okfang616@kkkkkba ,下方是两位大佬的原贴地址https://blog.csdn.net/m0_52537917/article/details/136222428?spm=1001.2014.3001.5502起因是拿豆子抽奖给抽上头了,导致实验豆子3=100痛失97实验豆 在咨询小蓝得知这个豆子给的是真的太......
  • [ARC074E] RGB Sequence
    原题链接好题,记录一下。首先若干个区间限制,根据套路,我们只在右端点统计信息。因为只有三种颜色,再看数据范围,可以考虑三维dp。设\(f_{i,j,k}\)设前\(i\)个数,与\(i\)颜色不同的两种颜色的最后出现位置\(j,k\),规定\(j\gek\)(\(j=k\)当且仅当它们都没出现,此时\(j=k=0\)......
  • CCPC Final 2023 B. Periodic Sequence
    https://vjudge.net/problem/QOJ-8543给定\(n\),对于\(i=1,2,\ldots,n\)求出最长可能的周期字符串序列长度F(i),满足序列中字符串的长度\(≤i\)。一个字符串序列\(S_1,S_2,\ldots,S_l\)是周期字符串序列,当且仅当对于每个\(1≤i<l\)都满足\(S_i\)是\(S_{i+1}\)的周期......
  • 第十三届蓝桥杯Python 大学 B 组 数位排序
    数位排序问题描述小蓝对一个数的数位之和很感兴趣,今天他要按照数位之和给数排序。当两个数各个数位之和不同时,将数位和较小的排在前面,当数位之和相等时,将数值小的排在前面。例如,2022排在409前面,因为2022的数位之和是6,小于409的数位之和13。又如,......
  • 蓝桥杯【第13届省赛】Python B组 C题
    C:纸张尺寸【问题描述】    在ISO国际标准中定义了A0纸张的大小为1189mm×841mm,将A0纸沿长边对折后为A1纸,大小为841mm×594mm,在对折的过程中长度直接取下整(实际裁剪时可能有损耗)。将A1纸沿长边对折后为A2纸,依此类推。     输入纸张的名称......
  • 蓝桥杯排序算法之low B三人组——冒泡,插入,选择
    目录一、题目二、分析三、代码一、题目分别用冒泡,插入,选择对列表li=[3,2,4,5,1,8,6,9,7]进行排序二、分析冒泡排序:它重复地走访要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经......