7-5 快乐的尽头 (17 分)
生活随笔
收集整理的這篇文章主要介紹了
7-5 快乐的尽头 (17 分)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
7-5 快樂的盡頭 (17 分)
題目
快樂風男面前有n個兵,呈線性排列編號為1~n,每個小兵攜帶a[i]個金幣1<=i<=1e5,為了體現快樂的極致,快樂風男知道了每個小兵攜帶的金幣,快樂的他E往無前(也就是說他不會回頭),但是快樂的他每次e的小兵的金幣都嚴格遞增,為了他能快樂多一點,請你給出他e兵的方案(上升子序列下標 如樣例最長上升子序列為1 2 3 4 ,你需要輸出其對應的下標1 2 3 5),讓他e的兵越多越好,如果有多個快樂方案,給出字典序最小1<=n<=100000
(由于原數據未分組,現在不需要讀入T,即每個數據一個案例)
輸入格式
第一行輸入n表示有n個小兵 第二行為每個小兵的攜帶金幣
輸出格式
第一行給出快樂風男可以e的最大兵數,第二行給出最佳方案
輸入樣例
5
1 2 3 3 4
輸出樣例
4
1 2 3 5
基本思路
這題的主要分為兩部分來看待。
第一部分是利用 貪心+二分法對初始序列的每個元素進行處理。(這一步模板化,不難)
這個模板下面這篇文章介紹的很詳細,可以先看一看,傳送門:
添加鏈接描述
第二部分是利用已有的信息倒推得出具體的LIS。(這一步很難理解,感覺也是這道題目的精髓所在)
可以先看我的代碼和代碼注釋(比較詳細),基礎比較好的同學應該還是能夠理解的。
代碼
#include <iostream> #include <cstring> #include <algorithm> using namespace std; const int INF = 0x3f3f3f3f; int maxLength;//最長遞增子序列的長度 int a[100001];//初始序列 int greedy[100001];//greedy[i]存放長度為i的LIS的結尾元素的最小值。初始化為INF int posInLIS[100001];//下標為a[i]的下標i,值為如果a[i]被選中(作為LIS的一部分),那么它在LIS中的位置 int firstAppear[100001]; int ans[100001];//下標表示LIS中第幾個位置,值表示該位置上的元素在數組a中的下標 int main() {//讀入初始序列aint n;cin >> n;for (int i = 1; i <= n; i++)cin >> a[i];//初始化數組greedymemset(greedy, INF, sizeof(greedy));//枚舉a[i]從a[1]到a[n]for (int i = 1; i <= n; i++){//在數組greedy中找到第一個大于等于a[i]元素的下標int indexInGreedy = lower_bound(greedy + 1, greedy + n + 1, a[i]) - greedy;//如果indexInGreedy為數組greedy最后一個元素的后一個位置下標,更新maxLengthif (greedy[indexInGreedy] == INF)maxLength++;//a[i]放到數組greedy的最后一個元素的后一個位置indexInGreedy//a[i]覆蓋原有的greedy[indexInGreedy]greedy[indexInGreedy] = a[i];//posInLIS[i]表示a[i]的indexInGreedy(如果a[i]被選中(作為LIS的一部分),那么它在LIS中的位置)posInLIS[i] = indexInGreedy;/*firstAppear[indexInGreedy]記錄第一個計算結果為indexInGreedy的a[i]的下標i用來求得最終的LIS的結尾元素在數組a中的下標*/if (!firstAppear[indexInGreedy])firstAppear[indexInGreedy] = i;}//求出最終的LIS的每個元素在數組a中的下標ans[maxLength] = firstAppear[maxLength];for (int indexIna = firstAppear[maxLength] - 1; indexIna >= 1; indexIna--) {if (a[indexIna] < a[ans[posInLIS[indexIna] + 1]])ans[posInLIS[indexIna]] = indexIna;}//輸出cout<<maxLength<<endl;for(int i=1;i<=maxLength;i++)cout<<(i==1?"":" ")<<ans[i];return 0; }總結
以上是生活随笔為你收集整理的7-5 快乐的尽头 (17 分)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 抗乙型肝炎表面抗原(HBsAg)抗体偶联
- 下一篇: 纳米压印光刻技术展望