題目大意:某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統.但是這種飛彈攔截系統有乙個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能超過前一發的高度.某天,雷達捕捉到敵國的飛彈來襲.由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的飛彈.
怎麼辦呢?多搞幾套系統唄!你說說倒蠻容易,成本呢?成本是個大問題啊.所以俺就到這裡來求救了,請幫助計算一下最少需要多少套攔截系統.
input
輸入若干組資料.每組資料報括:飛彈總個數(正整數),飛彈依此飛來的高度(雷達給出的高度資料是不大於30000的正整數,用空格分隔)
output
對應每組資料輸出攔截所有飛彈最少要配備多少套這種飛彈攔截系統.
sample input
8 389 207 155 300 299 170 158 65sample output2題解:這個題需要有乙個巧妙的轉換,不難發現求的就是這個序列的下降子串行個數,然後我們就有兩種做法,一種利用set來維護一下序列,每當插入乙個數時,如果set裡面沒有比這個數大的數,那麼就插入,即需要乙個攔截系統,否則的話就直接
把比他大的那個數刪除掉,再把當前這個數刪除掉,這樣保證了最後放進去的這個數表示了需要乙個系統,答案就是最後的set的大小,還有一種比較經典和巧妙的做法,就是轉換成求lis的長度來做,因為最長上公升子串行就保證了上公升的子串行是間隔最大的,那麼每乙個間隔之間的都是遞減的,即子串行中乙個數和後面乙個數之間的部分是遞減的,就是需要乙個飛彈攔截系統。
**實現:
#pragma gcc optimize(2)
#include#include#include#include#include#include#include#include#include#include#include#define pi atan(1.0)*4
#define e 2.718281828
#define rp(i,s,t) for (register int i = (s); i <= (t); i++)
#define rp(i,t,s) for (register int i = (t); i >= (s); i--)
#define ll long long
#define ull unsigned long long
#define mst(a,b) memset(a,b,sizeof(a))
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define pii pair#define mp make_pair
#define pb push_back
#define debug printf("ac\n");
using namespace std;
inline int read()
while(c>='0'&&c<='9')
return a*b;
}const int inf = 0x3f3f3f3f;
const int n = 1e5+7;
int dp[n],a[n];
int main()
cout<<*max_element(dp+1,dp+1+n)<}
return 0;}/*
1 73
3 36 6
2 2
*/
hdu 1257 最少攔截系統 dp
簡單的dp,只要把每個系統的飛彈當前最低高度儲存一下,以後得飛彈都用最小值比他大的系統中最小值最小的就 ok 啦。每次要麼更新原來系統最低高度,要麼加進去乙個新系統。include include include include include include include include inc...
hdu1257最少攔截系統(dp)
怎麼辦呢?多搞幾套系統唄 你說說倒蠻容易,成本呢?成本是個大問題啊.所以俺就到這裡來求救了,請幫助計算一下最少需要多少套攔截系統.2 解題報告 好多人可能會想用兩個迴圈,只要外迴圈大於內迴圈,即後面的大於前面的就 1,這種方法是不對的。應該用dp的思想。判斷什麼該 1的時候注意是用len i 還是l...
HDU 1257 最少攔截系統(DP)
這題其實就是求最長上公升子串行,可是今天丟人丟大了,前幾天剛做個這道題,今天比賽直接把 貼上了,晚上學長讓我講講怎麼用dp做的。一看就傻眼了,我自己心裡還想這題怎麼能這麼做呢!討論完題目回頭一想還確實是這麼回事。唉,悲劇啊 可以看看這組數 389 207 155 300 299 170 158 65...