[Jobdu] 题目1500:出操队形
在讀高中的時候,每天早上學(xué)校都要組織全校的師生進(jìn)行跑步來鍛煉身體,每當(dāng)出操令吹響時,大家就開始往樓下跑了,然后身高矮的排在隊(duì)伍的前面,身高較高的就要排在隊(duì)尾。突然,有一天出操負(fù)責(zé)人想了一個主意,想要變換一下隊(duì)形,就是當(dāng)大家都從樓上跑下來后,所有的學(xué)生都隨機(jī)地占在一排,然后出操負(fù)責(zé)人從隊(duì)伍中抽取出一部分學(xué)生,使得隊(duì)伍中剩余的學(xué)生的身高從前往后看,是一個先升高后下降的“山峰”形狀。據(jù)說這樣的形狀能夠給大家?guī)砗眠\(yùn),祝愿大家在學(xué)習(xí)的道路上勇攀高峰。(注,山峰只有一邊也符合條件,如1,1、2,2、1均符合條件)
輸入可能包含多個測試樣例。
對于每個測試案例,輸入的第一行是一個整數(shù)n(1<=n<=1000000):代表將要輸入的學(xué)生個數(shù)。
輸入的第二行包括n個整數(shù):代表學(xué)生的身高(cm)(身高為不高于200的正整數(shù))。
對應(yīng)每個測試案例,輸出需要抽出的最少學(xué)生人數(shù)。
最長遞增子序列問題的變型,從左找一遍,從右找一遍,再掃描一遍,找出dp1[i] + dp2[i]的最大值。最長遞增子序列可以用二分查找優(yōu)化成O(nlogn)的復(fù)雜度。手寫了個二分找lower_bound的函數(shù),也可以用STL里的。
1 #include <iostream> 2 #include <cstdio> 3 #include <vector> 4 #include <algorithm> 5 using namespace std; 6 7 int N; 8 vector<int> v; 9 vector<int> dp1, dp2; 10 vector<int> st; 11 12 void binSearch(int target) { 13 if (st.empty() || target > st.back()) { 14 st.push_back(target); 15 } else { 16 int l = 0, r = (int)st.size() - 1, m; 17 while (l <= r) { 18 m = l + ((r - l) >> 1); 19 if (st[m] >= target) r = m - 1; 20 else l = m + 1; 21 } 22 st[l] = target; 23 } 24 } 25 26 void getDP() { 27 st.clear(); 28 for (int i = 0; i < v.size(); ++i) { 29 binSearch(v[i]); 30 dp1[i] = st.size(); 31 } 32 st.clear(); 33 for (int i = (int)v.size() - 1; i >= 0; --i) { 34 binSearch(v[i]); 35 dp2[i] = st.size(); 36 } 37 } 38 39 void solve() { 40 getDP(); 41 int res = 0; 42 for (int i = 0; i < N; ++i) { 43 res = max(res, dp1[i] + dp2[i] - 1); 44 } 45 cout << N - res << endl; 46 } 47 48 int main() { 49 while (scanf("%d", &N) != EOF) { 50 v.resize(N); 51 dp1.resize(N); 52 dp2.resize(N); 53 for (int i = 0; i < N; ++i) scanf("%d", &v[i]); 54 solve(); 55 } 56 return 0; 57 } 58 /************************************************************** 59 Problem: 1500 60 User: hupo250 61 Language: C++ 62 Result: Accepted 63 Time:1050 ms 64 Memory:13244 kb 65 ****************************************************************/?
轉(zhuǎn)載于:https://www.cnblogs.com/easonliu/p/4461884.html
總結(jié)
以上是生活随笔為你收集整理的[Jobdu] 题目1500:出操队形的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java条件查询分页——总结
- 下一篇: BitmapFactory。Option