題目鏈接嚶嚶嚶~~ ios
這個題目仍是比較難的(至少對我來講是醬紫的嚶嚶嚶)。。數組
第一問,看題解好像用的都是DP,但其實能夠用二分,求最長不上升子序列,由於只要輸出答案,不用輸出方案,時間複雜度n leg(n),比DP會快一點。函數
第二問,暴力枚舉,時間複雜度小於n的平方spa
AC代碼:code
1 #include<set> 2 #include<map> 3 #include<list> 4 #include<queue> 5 #include<stack> 6 #include<string> 7 #include<cmath> 8 #include<ctime> 9 #include<vector> 10 #include<bitset> 11 #include<memory> 12 #include<utility> 13 #include<cstdio> 14 #include<sstream> 15 #include<iostream> 16 #include<cstdlib> 17 #include<cstring> 18 #include<algorithm>//忒長的頭文件,我的建議把會的都寫上去,以避免出現未調用函數庫的的命令 19 using namespace std; 20 int len=1,a,ans; 21 int tt[105],ttt[105];//tt用於第一問,ttt第二問 22 int w(){//二分查找 23 int l=1,r=len; 24 while(l<r){ 25 int mid=(l+r)/2; 26 if(tt[mid]<=a){ 27 r=mid; 28 } 29 else{ 30 l=mid+1; 31 } 32 } 33 return l; 34 } 35 bool pk(){//判斷數組是否爲空 36 for(int i=1;i<=100;i++){ 37 if(ttt[i]){ 38 return true; 39 } 40 } 41 return false; 42 } 43 int s1(){//這個函數跟下面那個我就不解釋了,本身悟去吧。。。 44 for(int i=1;i<=100;i++){ 45 if(ttt[i]){ 46 return ttt[i]; 47 } 48 } 49 } 50 int s2(){ 51 for(int i=1;i<=100;i++){ 52 if(ttt[i]){ 53 return i-1; 54 } 55 } 56 } 57 int main(){//主函數 58 cin>>tt[1]; 59 ttt[1]=tt[1]; 60 int n1=1; 61 int i=2; 62 while((scanf("%d",&a))!=EOF){ 63 ttt[i++]=a; 64 if(a<=tt[len]){//若是小於當前最小的數,就直接放到數組的最後一位 65 tt[++len]=a; 66 } 67 else{//不然就二分 68 tt[w()]=a; 69 } 70 n1++; 71 } 72 cout<<len<<endl; 73 while(pk()){//我最親愛的暴力 74 int an=s1(); 75 ttt[s2()]=0; 76 for(int i=s2()+1;i<=n1;i++){ 77 if(ttt[i]<=an&&ttt[i]){ 78 an=ttt[i]; 79 ttt[i]=0; 80 } 81 } 82 ans++; 83 } 84 cout<<ans<<endl; 85 return 0; 86 }
好的好的就醬紫,新人開博,望關注哦~~~嘻嘻~~blog