日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

7-5 快乐的尽头 (17 分)

發布時間:2024/3/12 65 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 分)的全部內容,希望文章能夠幫你解決所遇到的問題。

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