p1209攔截飛彈
實中程式設計者聯盟為了培養技術精湛的後備人才,必須從基礎題開始訓練。
某國為了防禦敵國的飛彈襲擊,研發出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲。由於該系統還在試驗階段,所以只有一套系統,因此有可能不能攔截所有的飛彈。
輸入資料只有一行,該行包含若干個資料,之間用半形逗號隔開,表示飛彈依次飛來的高度(飛彈最多有 20 枚,其高度為不大於 30000 的正整數)。
輸出資料只有一行,該行包含兩個資料,之間用半形逗號隔開。第乙個資料表示這套系統最多能攔截的飛彈數;第二個資料表示若要攔截所有飛彈至少要再新增多少套這樣的系統。
389,207,155,300,299,170,158,65
6,1
注意申題,切勿直接提交過去的程式!
本題由sun reader提供noip1999 經典問題 [實中程式設計者聯盟 2006.10]
原題來自tju
基礎題,第一問一看就是最長不上公升子串行。。。
然而第二問。。。是貪心
貼一段別人的分析吧
第二問顯然要難一點,最直觀的演算法是貪心,但是反例也容易找到,如:
6 5 1 7 3 2
如果第一次打6 5 3 2,顯然還要打兩次,而最好的方案是6 5 1/7 3 2。
顯然失敗之處在於第一種方案為了多打3和2,把1和7隔斷了,
但事實上把3和2留給第二套打
還不是一樣!因為每個飛彈都要打到,故我們應該把注意力放在「打到每一枚飛彈」。
在上乙個例子中,7是必須打到的,
因為它是最高的,所以必有一次攔截是以7開頭的!!!
既然是必須,那麼打7的同時順便打一打其他的絕對不比不打差!那麼打哪些呢?
下面說明:應該打後面飛彈中最高的乙個k。
先定義乙個概念:把當前能打的最大高度叫做「能力」
理由如下:
對於k以後的飛彈,絕對該打k,因為對於k以後的飛彈,不打k時能打到的,打了k也能打到(k是最高的嘛!),
k等於是「白打」,而對於7和k之間的飛彈,打了任何乙個就一定不能再打k了(k最高嘛!)反正中間的和
k不能一次打,先打不會比後打差!
類似的,下乙個目標是k後面的最高的。
可以證明,該演算法是正確的(從略),基礎較好的同學也可以通過建立有向無環圖來理解和證明這一演算法。
上**
#include #include using namespace std;
int a[100000],f[100000];
int main()
for(int i=1;i=a[i])
f[i]=max(f[j]+1,f[i]);
int max=0;
for(int i=1;imax)max=f[i];
printf("%d,",max);
l--;
n=l;
u=0;
xx=0;
while(l)
}if(max==0)
else
}printf("%d\n",xx);
return 0;
}
攔截飛彈 vip
描述 某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的飛彈。輸入飛彈依次飛來的高度 雷...
1044 攔截飛彈
1999年noip全國聯賽提高組 時間限制 1 s 空間限制 128000 kb 題目等級 gold 題解 題目描述 description 某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的...
攔截飛彈 題解
description ggf最近經常遭到不明飛彈的襲擊,因此他只好開發了一套飛彈攔截系統。該系統非常先進,使用會拐彎的雷射對飛彈進行射擊。所有被雷射擊中的飛彈就瞬間完蛋,而且一束雷射可以同時摧毀多枚飛彈。但雷射只能向上發射,所以若同一束雷射能依次擊中多枚飛彈,則這些飛彈座標的每一維都嚴格單調上公升...