動態規劃 氣泡排序 愛奇藝2018招聘

2021-09-09 09:21:28 字數 1451 閱讀 2806

這次分析一下2023年愛奇藝招聘的氣泡排序的題目。

題目描述:牛牛學習了氣泡排序,並寫下以下氣泡排序的偽**,注意牛牛排序的陣列a是從下標0開始的。

bubblesort(a):

repeat length(a)-1 times:

for every i from 0 to length(a) - 2:

if a[i] > a[i+1] then:

swap a[i] and a[i+1]

牛牛現在要使用上述演算法對乙個陣列a排序。在排序前牛牛允許執行最多k次特定操作(可以不使用完),每次特定操作選擇乙個連續子陣列,然後對其進行翻轉,並且k次特定操作選擇的子陣列不相交。

例如a = , k = 1,如果牛牛選擇的子陣列是[2,4](注意下標從0開始),那麼翻轉之後的陣列變為a = 。牛牛知道氣泡排序的效率一定程度上取決於swap操作次數,牛牛想知道對於乙個陣列a在進行k次特定操作之後,再進行上述氣泡排序最少的swap操作次數是多少?

輸入:輸入包括兩行,第一行包括兩個正整數n和k(2 ≤ n ≤ 50, 1 ≤ k ≤ 50),表示陣列的長度和允許最多的特定操作次數。 第二行n個正整數a[i](1 ≤ a[i] ≤ 1000),表示陣列內的元素,以空格分割。

輸出:輸出乙個整數,表示在執行最多k次特定操作之後,對陣列進行上述氣泡排序需要的swap操作次數。

解題思路:看到題目,首先要思考,交換的次數跟什麼有關,通過觀察可以看出,氣泡排序的總交換次數等於陣列中每乙個元素的逆序數對的和,所謂逆序數對就是排在該元素後面而且大於該元素的個數。所以問題就轉化為對陣列旋轉不超過k次的條件下陣列所有元素的逆序數對和最小。所以我們每次進行旋轉應該盡量使得旋轉的陣列逆序數對變小。這裡我們採用動態規劃的思想。用dp[i][j]表示前i個數總共旋轉j次最多能夠減少的逆序數對。那麼對於第i + 1個數,可以將前面任意乙個數和第i+1個數進行旋轉得到減少的逆序數對,也可以不旋轉。所以可以得到遞推公式:

這裡的re[t][i]表示從t到i之間的逆序數對,sh[t][i]表示陣列t到i的元素旋轉後的逆序數對。下面是**:

#include#include#include#includeusing namespace std;

//獲得從m到n的逆序數總數

int get_re(vectorarr, int m, int n)}}

return tem;

}//獲得從m到n旋轉後的逆序數總數

int get_sh(vectorarr, int m, int n)}}

return tem;

}int main()

for(int i = 2; i <= n; i++)

dp[i][j] = max(dp[i - 1][j], tem);}}

cout << get_re(arr, 1, n) - dp[n][k] << endl;

}return 0;

}

愛奇藝2018演算法工程師筆試

如果乙個字串s是由兩個字串t連線而成,即s t t,我們就稱s叫做平方串,例如 aabaab x 都是平方串.牛牛現在有乙個字串s,請你幫助牛牛從s中移除盡量少的字元,讓剩下的字串是乙個平方串。換句話說,就是找出s的最長子序列並且這個子串行構成乙個平方串。輸入描述 輸入乙個字串s,字串長度lengt...

愛奇藝2018春招 大資料方向筆試分析

作為一名普通的大三學生,第一次做筆試,所以想發表一些對愛奇藝筆試的看法 單選題 45分 因為是大資料方向,所以單選題考了很多大資料結構的題目,如mapreduce,hadoopde等,作為乙個只上課大資料課的學生來說,我真的對這些一點不知道,還好考試前在牛客刷了點其他公司大資料方向的題,有點印象感覺...

愛奇藝2023年23道校招真題

第1道 小易喜歡的數列 include includeusing namespace std const int maxn 1e5 5 const int mod 1000000007 define ll long long int ll map 11 maxn int main for int i...