pat甲级1101

思路:主元的特征是大于左侧元素,小于右侧元素。
方法一,需三次遍历。从左到右遍历一次,得到各位置左侧最大数的数组,再从右到左遍历得到各位置右侧最小数的数组。最后遍历判断是否是主元。
方法二,需一次遍历。先把序列sort得到各元素在有序序列中的最终位置,再从左到右遍历,若该元素在最终位置,且大于其左侧所有元素,那么他就可以是主元。代码如下:

#include <cstdio>
#include <algorithm>

int main(){
    int N;
    scanf("%d", &N);
    int nums[N], backup[N];
    for(int i=0; i<N; i++){
        scanf("%d", &nums[i]);
        backup[i] = nums[i];
    }
    std::sort(backup, backup+N);
    int ans[N];
    int ans_len=0;
    int left_max = -1;
    for(int i=0; i<N; i++){
        if(nums[i]==backup[i] && nums[i]>left_max){
            ans[ans_len++] = nums[i];
        }
        left_max = std::max(left_max, nums[i]);
    }
    std::sort(ans, ans+ans_len);
    printf("%d\n", ans_len);
    if(ans_len==0) printf("\n");
    else{
        for(int i=0; i<ans_len; i++){
            printf("%d", ans[i]);
            if(i<ans_len-1) printf(" ");
        }
    }

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值