題目鏈結
錦囊2分析:最長不下降子串行問題用dp解決。最少要配備的系統數問題,即找有幾條「最長不下降子串行」能攔截全部飛彈。求一套系統攔截的飛彈最大值為最長不下降子串行問題,用動態規劃。 求最少多少套系統需要使用貪心法,每枚後面的炮彈使用能攔截它的最低的系統。
問題描述
某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的飛彈。
輸入飛彈依次飛來的高度(雷達給出的高度資料是不大於30000的正整數),計算這套系統最多能攔截多少飛彈,如果要攔截所有飛彈最少要配備多少套這種飛彈攔截系統。
方法一:感覺這道題很巧妙的將這兩個看似相同的演算法結合在了一起,乙個是最長非下降子串行問題,另乙個是最長上公升子串行問題,考慮下題意,問的是最少要配備的系統數,說白了就是看你能找幾條「最長非上公升子串行」,將序列倒置下就換成求最長非下降子串行,這裡求得條數,恰好就是最長上公升子串行的最大個數,自己模擬下即可
原文:
方法二:直接貪心,每次取最長不降子串行,然後在剩下的數中迴圈求最長不降子串行直到取完為止。#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 問題描述 某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲。由於該系...