問題描述:
某國為了防禦敵國的飛彈襲擊,開發出一種飛彈攔截系統,但是這種攔截系統有乙個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲,由於該系統還在試用階段。所以一套系統有可能不能攔截所有的飛彈。
輸入飛彈依次飛來的高度(雷達給出的高度不大於30000的正整數)。計算要攔截所有飛彈最小需要配備多少套這種飛彈攔截系統。
輸入:n顆依次飛來的高度(1≤n≤1000)。
輸出:要攔截所有飛彈最小配備的系統數k。
輸入樣例:
389 207 155 300 299 170 158 65輸出樣例:
2自己挖坑自己填,刺激.jpg
(挖坑)最初思路:「由於每次只有出現高於上乙個飛彈高度的飛彈出現時,就會來判斷是否增加攔截系統」,所以先遍歷一遍將出現n[i] //對於賦有雙重含義的變數需注意變數在一種含義下變化了,另一種情況裡的該變數會受影響。
#includeusing namespace std;
int main() }
bool flag;
int min, c, key;
for(int j = 1; j < z; j++)
}} if(flag == true)
}cout << k;
return 0;
}submit -> 70分,t-t
最後找到了corner case:10 9 8 10 7 6 9 -> 2
判斷是否增加系統不僅僅是在出現遞增數對處,每枚飛彈高度都會影響增減系統,上面case中,兩個系統分別攔截的高度是k1[10 9 8 7 6] k2[10 9]
所以最初遇遞增存a,b陣列的方法是錯誤的。
正確解法:l[1]存n[0]初設為第一套系統的可攔截最大高度,依次對後面到來的飛彈進行判斷,若高於前面所有系統的可攔截的最高高度,則系統數加一,並令新增系統的最大攔截高度為當前飛彈高度,否則在前面所有攔截高度高於當前飛彈高度的系統中選擇攔截高度最低的系統,令其最大攔截高度為當前飛彈高度。
#include#includeusing namespace std;
int main()
} if(p == 0)
l[++k] = n[i];
else
l[p] = n[i]; }
cout << k;
}
攔截飛彈(貪心 動態)
時間限制 1000 ms 記憶體限制 65536 kb 某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有...
攔截飛彈問題(貪心演算法)
description 某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的飛彈。輸入飛彈...
攔截飛彈問題(貪心演算法)
時間限制 1000 ms 記憶體限制 65536 kb 某國為了防禦敵國的飛彈襲擊,開發出一種飛彈攔截系統,但是這種攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲,由於該系統還在試用階段。所以一套系統有可能不能攔截所...