【題意】:某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的飛彈。輸入飛彈依次飛來的高度(雷達給出的高度資料是不大於30000的正整數,飛彈數不超過1000),計算這套系統最多能攔截多少飛彈,如果要攔截所有飛彈最少要配備多少套這種飛彈攔截系統。
【分析】:第乙個輸出直接lis就行,對於第二個問要考慮貪心思想,考慮乙個攔截系統,起最後乙個的高度肯定越大越有利於後面的元素增加進來,所需要的系統肯定就越少。所以用乙個g陣列來維護其最小元素的最大值,元素的個數就是最終所需的最少的攔截系統的個數。
#include
#include
#include
using namespace std;
const
int maxn=
1e3+10;
int arr[maxn]
,t,dp[maxn]
;int g[maxn]
;int
main()
int ans=0;
for(
int i=
1;i<=tot;
++i)
}printf
("%d\n"
,ans)
; ans=0;
//貪心,g陣列維護最大的最短長度
for(
int i=
1;i<=tot;
++i)
printf
("%d\n"
,ans)
;system
("pause");
}
【題意】:為了對抗附近惡意國家的威脅,r國更新了他們的飛彈防禦系統。一套防禦系統的飛彈攔截高度要麼一直上公升要麼一直下降。例如,一套系統先後攔截了高度為3和高度為4的兩發飛彈,那麼接下來該系統就只能攔截高度大於4的飛彈。給定即將襲來的一系列飛彈的高度,請你求出至少需要多少套防禦系統,就可以將它們全部擊落。
樣例輸入(n<=50):
5
3 5 2 4 1
0
樣例輸出:
2
【分析】:對於每乙個元素,它只有兩種狀態:屬於上公升攔截系統或者屬於下降攔截系統,所以用乙個 dfs 既可以列舉所有狀態;直接 dfs 其時間複雜度肯定超時(2^50),所以隨便剪剪枝就好了。
#include
#include
#include
using namespace std;
const
int maxn=55;
int arr[maxn]
,n,up[maxn]
,down[maxn]
;int ans;
void
dfs(
int u,
int d,
int num)
//u為上公升系統的個數,d為下降系統的個數,num為陣列中低階個數
int k=1;
//屬於上公升子串行
while
(up[k]
>=arr[num]
&&k<=u) k++
;int t=up[k]
; up[k]
=arr[num];if
(k>u)
dfs(u+
1,d,num+1)
;else
dfs(u,d,num+1)
; up[k]
=t; k=1;
//屬於下降子串行
while
(down[k]
<=arr[num]
&&k<=d) k++
; t=down[k]
; down[k]
=arr[num];if
(k>d)
dfs(u,d+
1,num+1)
;else
dfs(u,d,num+1)
; down[k]
=t; k=1;
}int
main()
//system("pause");
}
兩道選擇題
教授面帶微笑,走進教室,對我們說 我受一家機構委託,來做一項問卷調查,請同學們幫個忙。一聽這話,教室裡輕微的一陣議論開了,大學課堂本來枯燥,這下好玩多了。問卷表發下來,一看,只有兩道題。第一題 他很愛她。她細細的瓜子臉,彎彎的娥眉,面色白皙,美麗動人。可是有一天,她不幸遇上了車禍,痊癒後,臉上留下幾...
兩道選擇題
記得大學一堂選修課上。教授面帶微笑,走進教室,對我們說 我受一家機構委託,來做一項問卷調查,請同學們幫個忙。一聽這話,教室裡輕微的一陣議論開了,大學課堂本來枯燥,這下好玩多了。問卷表發下來,一看,只有兩道題。第一題 他很愛她。她細細的瓜子臉,彎彎的娥眉,面色白皙,美麗動人。可是有一天,她不幸遇上了車...
兩道相似KMP題
1.poj 3450 coporate identity 這兩題的解法都是列舉子串,然後匹配,像這種題目以後可以不用kmp來做,直接字串自帶的strstr函式搞定,如果字串未出現,該函式返回null。下面貼出其比較。kmp版 1360ms 888kb include include include ...