難度:普及/提高-
題目型別:動規
提交次數:1
涉及知識:線性動規
某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的飛彈。
輸入飛彈依次飛來的高度(雷達給出的高度資料是不大於30000的正整數),計算這套系統最多能攔截多少飛彈,如果要攔截所有飛彈最少要配備多少套這種飛彈攔截系統。
輸入格式:
一行,若干個正整數。
輸出格式:
2行,每行乙個整數,第乙個數字表示這套系統最多能攔截多少飛彈,第二個數字表示如果要攔截所有飛彈最少要配備多少套這種飛彈攔截系統。
**:
1 #include2 #include3using
namespace
std;
4int a[10005];5
int d[10005];6
intmain()
1314
for(i = 0; i < n; i++)
15for(j = 0; j < i; j++)
16if(a[i]17 d[i] = max(d[i], d[j]+1
);18
int ans = 0;19
for(i = 0; i < n; i++)
20 ans =max(ans, d[i]);
21 cout2223for(i = 0; i < n; i++) d[i] = 1;
24ans = 0;
25
26for(i = 0; i < n; i++)
27for(j = 0; j < i; j++)
28if(a[j]29 d[i] = max(d[i], d[j]+1
);30
for(i = 0; i < n; i++)
31 ans =max(ans, d[i]);
32 cout33return0;
34 }
備註:
第二問是難點。題解裡說到可以轉化為求最長上公升子串行,然而我想了一天也不知道為什麼。看到有乙個博主這樣解釋「……這個子串行裡的每乙個飛彈都不可能用同乙個攔截系統攔下……」,也就是說每乙個飛彈都得單用一套系統,這個倒很好理解。那為什麼在這個序列之外的都可以跟這個序列裡的某一枚飛彈合用一套系統呢?我充分利用了一下我們上數學自招課培養的思維方法(……)分析了一下。從反面想可以理解,這個序列之外的數總能在它之前找到乙個序列內比它大 或 在它之後序列內比它小的數,它跟人家就可以共用。從反面想,如果存在一串行外的飛彈,它之前的序列內所有數都比它小,它之後序列內所有數都比它大,那它一定在最長上公升子串行內。與在序列外的假設矛盾。
哇塞我這個反證證得真漂亮。表揚一下自己,這課真沒白上。
然而並沒有什麼卵用。從正面想我根本不可能想出來。
P1020 飛彈攔截
題目描述 某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的飛彈。輸入飛彈依次飛來的高度...
P1020 飛彈攔截
某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的飛彈。輸入飛彈依次飛來的高度 雷達給出...
P1020 飛彈攔截
原題鏈結 貪心 記錄每套系統攔截過的最小高度 新來的飛彈 如果高於所有飛彈的最低高度 那就只能再加一套了嘛 如果低於某些系統的最低高度 那就貪心 把它加到 最低高度最低的一套系統內 include include include include include include include inc...