最长非递减子序列变形题,把大于等于10000的copy五次放回去就可以了
ac代码:
#include <cstdio> #include <cstring> #include <iostream> #include <cstring> #include <algorithm> using namespace std; #define LL long long const LL N=200105; int a[N]; int dp[N]; int LIS(int a[],int len) { int dlen=1; memset(dp,0,sizeof(dp)); dp[0]=a[0];// for(int i=1;i<len;i++) { if(a[i] < dp[0]) // 最开始的位置 { dp[0]=a[i]; continue; } if(a[i] >= dp[dlen-1]) { dp[dlen++]=a[i];// new insert } else { int pos=upper_bound(dp,dp+dlen,a[i])-dp;// dp[pos]=a[i]; } } return dlen; } int main() { int len=0; int x; while(~scanf("%d",&x)) { if(x<0) continue; if(x>=10000) { x-=10000; for(int i=1;i<=5;i++) a[len++]=x; } else a[len++]=x; } /* for(int i=1;i<=14;i++) { scanf("%d",&x); if(x<0) continue; if(x>=10000) { x-=10000; for(int i=1;i<=5;i++) a[len++]=x; } else a[len++]=x; } */ // for(int i=1;i<=len;i++) cout<<a[i]<<' '; // cout<<endl; cout<<LIS(a,len)<<endl; return 0; }