日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

PAT甲级1101 Quick Sort:[C++题解]DP、快速排序划分个数、快排

發布時間:2025/4/5 c/c++ 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PAT甲级1101 Quick Sort:[C++题解]DP、快速排序划分个数、快排 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 題目分析
    • 題目來源

題目分析


來源:acwing

題意重述:快排的原理,給定一個序列,請判斷其中幾個數可以作為快速排序劃分步驟的分界點。
分界點充分必要條件是:左邊的數都比它小,右邊的數都比它大(題目給出所有數都不相同,所以是嚴格的大小關系)。

解題:

想判斷第i個數a[i]左邊是不是所有的數都小于它,只需要求左邊最大的數是不是比a[i]小,如果最大的數都小于a[i],那么所有的數都小于它。所以我們預處理一個數組L[N],L[i]L[N],L[i]L[N],L[i]表示a[1]a[1]a[1] ~ a[i]a[i]a[i]最大的數

同理,像判斷a[i]右邊的數是不是都比它大,只需要看右邊的最小值是否比它大。所以預處理右邊一個數組R[N],R[i]R[N],R[i]R[N],R[i]表示a[i]a[i]a[i] ~ a[n]a[n]a[n]最小的數

所以我們只需要判斷L[1]L[1]L[1] ~ L[i?1]L[i-1]L[i?1]中最大值 小于a[i]a[i]a[i]a[i]a[i]a[i]小于R[i]R[i]R[i] ~ R[n]R[n]R[n]中的最小值即可。 記為 L(i?1)<a[i]<R(i+1)L(i-1) < a[i] < R(i+1)L(i?1)<a[i]<R(i+1)

AC代碼

#include<bits/stdc++.h> using namespace std;const int N = 100010 , INF = 2e9;int n; int a[N],l[N],r[N];int main(){cin >> n;for(int i =1; i<=n; i++) cin>> a[i];//l[i]中存的是前a[1]~a[i]中最大的數,l[3]存的是a[1]到a[3]中最大的數//從前往后枚舉for(int i =1; i<= n; i++) l[i] = max(l[i-1], a[i]);//r[i]中存的是從r[i]~r[n]中最小的數//這里從后往前枚舉r[n+1] = INF;for(int i = n; i; i--) r[i] = min(r[i+1],a[i]);vector<int> res; //存放結果// 如果a[i]是分界值,放進res里面for(int i =1; i<= n; i++)if(l[i-1] < a[i] && a[i] < r[i+1]) res.push_back(a[i]);cout << res.size()<<endl;if(res.size()){cout << res[0];for(int i=1; i<res.size();i++ ) cout<<" "<<res[i];}else cout<<endl; }

題目來源

PAT甲級1101 Quick Sort
https://www.acwing.com/problem/content/1593/

總結

以上是生活随笔為你收集整理的PAT甲级1101 Quick Sort:[C++题解]DP、快速排序划分个数、快排的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。