這道題是個有想法的列舉qwq
飛彈攔截【題目鏈結】
注意:此飛彈攔截非彼飛彈攔截p1020 飛彈攔截
一道題是2023年的,然後我們現在要寫的是經過11年韜光養晦之後的飛彈攔截
solution:
要不先說一說我錯誤的貪心防止踩坑?
錯誤貪心1:40pts:先比較某個點到攔截系統1和2的距離,取距離較小的乙個,然後看這個距離是否在當前的工作半徑之內,如果在,繼續迴圈,不在的話就更新當前某個攔截系統的工作半徑。
顯然這個貪心是不對的qwq(用jiaozhitou想想也可以想出來)
now1=now2=0;
for(int i=1;i<=n;i++)錯誤貪心2:70pts:應該很多小夥伴都和我一樣卡在了70pts,因為這樣的貪心是錯誤的emm:else
}
70pts的貪心就是將錯誤1的if語句提到了外面,從而使一些可以被直接攔截的直接攔截而不是先取距離較小的一套攔截系統再進行攔截;但是還是有不對的地方(我不知道為什麼)
now1=now2=0首先顯然是輸入然後計算某個飛彈到攔截系統的距離(這裡直接計算平方啦沒有再開根);
for(int i=1;i<=n;i++)
我比較喜歡寫函式和結構體(全域性變數我也很愛),所以就以函式的形式求了距離的平方,儲存在結構體中。
計算完距離的平方之後,就是十分神奇的列舉了:
首先我們可以將所有的飛彈按照距離某乙個系統的距離從遠到近排列(這裡排列系統1),然後先假定所有的飛彈都由系統1攔截,計算乙個代價,然後依次列舉1~n個飛彈由系統2攔截,求乙個最小值,即為所求答案;
以下是code:
#includeusingnamespace
std;
intx1,y11,x2,y2,now1,now2,minn;
intn;
struct
noded[
100010
];bool
cmp(node x,node y)
int jl(int x,int y,int
k)int
main()
sort(d+1,d+n+1
,cmp);
now1=d[1].dis1;minn=d[1
].dis1;
int js=0
;
for(int i=1;i<=n;i++)
cout
}
洛谷 P1158 飛彈攔截
題目描述 經過 11 年的韜光養晦,某國研發出了一種新的飛彈攔截系統,凡是與它的距離不超過其工作半徑的飛彈都能夠被它成功攔截。當工作半徑為 0 時,則能夠攔截與它位置恰好相同的飛彈。但該飛彈攔截系統也存在這樣的缺陷 每套系統每天只能設定一次工作半徑。而當天的使用代價,就是所有系統工作半徑的平方和。某...
洛谷P1158 飛彈攔截 排序
恢復內容開始 洛谷p1158 飛彈攔截 排序 算是有技巧的列舉吧 題意 用兩套系統來攔截飛彈,乙個系統的費用等於這個系統攔截的飛彈中離他最遠的那顆飛彈 和系統的距離 的平方 排序 將每顆飛彈按距離系統1 的距離排序,然後列舉n 0 選這些飛彈為系統1最遠能夠攔截的飛彈 然後就可以更新下一次 系統2要...
P1158 飛彈攔截
題目描述 經過 11年的韜光養晦,某國研發出了一種新的飛彈攔截系統,凡是與它的距離不超過其工作半徑的飛彈都能夠被它成功攔截。當工作半徑為 0時,則能夠攔截與它位置恰好相同的飛彈。但該飛彈攔截系統也存在這樣的缺陷 每套系統每天只能設定一次工作半徑。而當天的使用代價,就是所有系統工作半徑的平方和。某天,...