题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805063166312448
题意:给定n个数的重排列,求至少需要多少轨道,使最终的排列按降序排列。
思路:这道题和hdoj1257是类似的,http://acm.hdu.edu.cn/showproblem.php?pid=1257,其实就是求原排列最少有多少个下降子序列,这也就是LIS问题的O(nlogn)解法原理,所以本题就转换成了求LIS的长度问题。
AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int len,tmp,n; 5 int dp[100005]; 6 7 int main(){ 8 scanf("%d",&n); 9 scanf("%d",&tmp); 10 --n; 11 dp[++len]=tmp; 12 while(n--){ 13 scanf("%d",&tmp); 14 if(tmp>dp[len]) dp[++len]=tmp; 15 else if(tmp<=dp[1]) dp[1]=tmp; 16 else{ 17 int l=1,r=len,m; 18 while(l<=r){ 19 m=(l+r)/2; 20 if(tmp>dp[m-1]&&tmp<=dp[m]) break; 21 if(tmp>dp[m]) l=m+1; 22 else r=m-1; 23 } 24 dp[m]=tmp; 25 } 26 } 27 printf("%d ",len); 28 return 0; 29 }