福建OJ——数字

题目链接


题目描述

你有一个长度为 n 的正整数序列 ,第 i 个数字为a_{i}

你要输出 n 个数字,设 j 为最大的数字,使得 a_{i} < a_{j}。如果 j - i - 1 \geq 0,则你输出的第 i 个数字为 j - i - 1,否则输出 -1。(若这种 j 不存在也输出 -1

(或者说,对于每个 i 若 a_{i} 的右边不存在比它小的数字则输出 -1,否则找到最靠右的一个小于 a_{i} 的 a_{j},输出 j - i - 1。)


输入格式

第一行一个数  n,表示序列长度。

第二行 n 个数,第 i 个数为 a_{i},代表序列中的第 i 个数字。


输出格式

一行 n 个数,要求如题面。


样例

样例输入 1

6
10 8 5 3 50 45

样例输出 1

2 1 0 -1 0 -1 

样例输入 2

7
10 4 6 3 2 8 15

样例输出 2

4 2 1 0 -1 -1 -1 

样例输入 3

5
10 3 1 10 11

样例输出 3

1 0 -1 -1 -1 

数据范围与提示

对于 30\% 数据 ,2 \leqslant n \leqslant 10^{3} ,a_{i} \leqslant 10^{5}

对于 50\% 数据 ,2 \leqslant n \leqslant 10^{4} ,a_{i} \leqslant 10^{5}

对于 70\% 数据 ,2 \leqslant n \leqslant 10^{5} ,a_{i} \leqslant 10^{5}

对于所有数据 ,2 \leqslant n \leqslant 10^{5} ,a_{i} \leqslant 10^{9}


解题思路

本题先全部遍历一遍,但这样可能会超时。这里有一个小技巧(先从后面遍历,老师出题都很坑,会让你遍历到最后一个)(9,10测试点),所以这题也没什么好说的。遍历一遍,从最后开始,一个一个遍历(我是这么写的)(bushi)

不知道有什么更好的方法,蒟蒻的。


代码实现

#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int a[N];
int main() {
    freopen("number.in", "r", stdin);
    freopen("number.out", "w", stdout);
    int n;
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }
    for (int i = 0; i < n - 1; i++) {
        bool flag = 0;
        for (int j = n - 1; j > i; j--) {
            if (a[j] < a[i]) {
                cout << j - i - 1 << " ";
                flag = 1;
                break;
            }
        }
        if (!flag)
            cout << -1 << " ";
    }
    cout << -1 << endl;
    return 0;
}

反正过了(bushi)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值