P1020 【導彈攔截】

題目鏈接嚶嚶嚶~~ 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

相關文章
相關標籤/搜索