牛客陣列和字串2.5
阿新 • • 發佈:2022-02-06
基礎很不紮實,一邊學新的,一邊刷題好了
求距離:
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; }
求逆序數:
這個資料範圍實在太小,直接暴力...