演算法訓練 攔截飛彈

2021-09-11 06:55:23 字數 1690 閱讀 6179

題目鏈結

錦囊2

求一套系統攔截的飛彈最大值為最長不下降子串行問題,用動態規劃。 求最少多少套系統需要使用貪心法,每枚後面的炮彈使用能攔截它的最低的系統。

問題描述

某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的飛彈。

輸入飛彈依次飛來的高度(雷達給出的高度資料是不大於30000的正整數),計算這套系統最多能攔截多少飛彈,如果要攔截所有飛彈最少要配備多少套這種飛彈攔截系統。 

分析:最長不下降子串行問題用dp解決。最少要配備的系統數問題,即找有幾條「最長不下降子串行」能攔截全部飛彈。

方法一:感覺這道題很巧妙的將這兩個看似相同的演算法結合在了一起,乙個是最長非下降子串行問題,另乙個是最長上公升子串行問題,考慮下題意,問的是最少要配備的系統數,說白了就是看你能找幾條「最長非上公升子串行」,將序列倒置下就換成求最長非下降子串行,這裡求得條數,恰好就是最長上公升子串行的最大個數,自己模擬下即可

原文: 

#include #include #include using namespace std;

const int n = 30000;

int down[n],up[n], a[n];

int main(int argc, char** ar**) else

} maxdown = max(maxdown, ++down[len]);

maxup = max(maxup, ++up[len]);

len++;

} cout<< maxdown << "\n"<< maxup<< "\n";

return 0;

}

方法二:直接貪心,每次取最長不降子串行,然後在剩下的數中迴圈求最長不降子串行直到取完為止。 

#include #include #include using namespace std;

const int n = 30000;

int d[n], a[n], pre[n],vis[n];

int main(int argc, char** ar**)

} if(++d[len] > ans)

len++;

} cout<< ans << "\n";

int sum = 1;

while(ans < len)

for(int i = 0; i < len; i++)

len = cnt;

ans = 0; id = 0;

for(int i = 0; i < len ; i++)

}if(++d[i] > ans)

} }cout<< sum<< "\n";

return 0;

}

輸入格式

一行,為飛彈依次飛來的高度

輸出格式

兩行,分別是最多能攔截的飛彈數與要攔截所有飛彈最少要配備的系統數

樣例輸入

389 207 155 300 299 170 158 65

樣例輸出62

演算法訓練 攔截飛彈

演算法訓練 攔截飛彈 時間限制 1.0s 記憶體限制 256.0mb 問題描述 某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲。由於該系統還在試用階段,...

藍橋杯 演算法訓練 攔截飛彈

問題描述 某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的飛彈。輸入飛彈依次飛來的高度...

藍橋杯 演算法訓練 攔截飛彈

試題 演算法訓練 攔截飛彈 資源限制 時間限制 1.0s 記憶體限制 256.0mb 問題描述 某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲。由於該系...