1. 程式人生 > 其它 >牛客陣列和字串2.5

牛客陣列和字串2.5

基礎很不紮實,一邊學新的,一邊刷題好了

求距離:

1006-求距離_牛客競賽語法入門班陣列字串習題 (nowcoder.com)

連結:https://ac.nowcoder.com/acm/contest/19306/1006
來源:牛客網

給你一個1 -> n的排列,現在有一次機會可以交換兩個數的位置,求交換後最小值和最大值之間的最大距離是多少?

輸入描述:

第一行一個數n
之後一行n個數表示這個排列

輸出描述:

輸出一行一個數表示答案
示例1

輸入

複製
5
4 5 1 3 2

輸出

複製
3

說明

把1和2交換後
序列為4 5 2 3 1
最大值5在陣列的2位置,最小值1在陣列的5位置
距離為3

備註:

對於100%的資料,1 <= n <= 100
簡單的模擬,沒啥難度
把當前的最大最小值的位置算出來,因為距離最大,肯定是兩邊,分別求距離取其最大值就好了
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=110;
int a[N],b[N];
int main(){
    int n,maxn=0,minn=10000000,x,m,ex,em;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin
>>a[i]; if(maxn<a[i]) { maxn=a[i]; x=i; } if(minn>a[i]) { minn=a[i]; m=i; } } ex=max(abs(n-m),abs(m-1)); em=max(abs(n-x),abs(x-1)); maxn=max(ex,em); cout<<maxn<<endl;
return 0; }

陣列下標:

1007-數列下標_牛客競賽語法入門班陣列字串習題 (nowcoder.com)

連結:https://ac.nowcoder.com/acm/contest/19306/1007
來源:牛客網

題目描述

給出一個數列 A,求出一個數列B. 其中Bi 表示 數列A中 Ai 右邊第一個比 Ai 大的數的下標(從1開始計數),沒有找到這一個下標 Bi 就為0 輸出數列B

輸入描述:

第一行1個數字 n (n ≤ 10000) 第二行n個數字第 i 個數字為 Ai (0 ≤ Ai ≤ 1000000000)

輸出描述:

一共一行,第 i 個數和第 i+1 個數中間用空格隔開.
示例1

輸入

複製
6
3 2 6 1 1 2

輸出

複製
3 3 0 6 6 0

說明

樣例不用解釋
這個題的資料範圍很小哦
所以可以直接暴力來寫
也可以用單調棧來寫,對程式碼進行優化:
暴力:
#include<iostream>
using namespace std;
const int N=10010;
int stk[N],tt,a[N],b[N];
int main(){
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    for(int i=1;i<=n;i++)
    {
        int x=1;
        for(int j=i+1;j<=n;j++)
        {
            if(a[j]>a[i])
            {
                printf("%d ",j);
                x=0;
                break;
            }
        }
        if(x)
        printf("0 ");
    }
    return 0;
}

單調棧(模板題):

洛谷p5788

#include <iostream>//這個單調棧是單調遞減的棧,每次都找離的最近的比那個數字大的數 
using namespace std;
const int N=3000005;
int n,a[N],stk[N],f[N],tt;//f陣列是存結果的陣列 
int main() {
    scanf("%d",&n);
    for (int i=1; i<=n; i++) scanf("%d",&a[i]);
    for (int i=n; i>=1; i--)//倒著開始找 
    {
        while (tt&&a[i]>=a[stk[tt]]) tt--;//再強調一下,棧裡面壓的是下標,所以用的是a[stk[tt]] 
        f[i]=stk[tt];//這時候的棧頂就是最大的那個數了 
        stk[++tt]=i;//因為最後輸出的是下標,把下標壓入棧裡面 
    }
    for (int i=1; i<=n; i++) printf("%d ",f[i]);
    return 0;
}

求逆序數:

這個資料範圍實在太小,直接暴力...