題目背景
jyy 最近迷上了一款塔防遊戲,在遊戲裡 jyy 除了建設建築,還可以使用炸彈對螢幕上的敵人進行範圍殺傷。
題目描述
遊戲地圖可以簡單認為是乙個二維平面。jyy 建造了nn個建築,每個建築都是乙個圓,其中第ii個建築的圓心位於(x_i,y_i)(xi
,yi )且半徑為r_iri
。地圖上一共有mm個敵人,乙個敵人可以近似看成乙個平面上的點,其中第ii個敵人位於(p_i,q_i)(pi
,qi )。jyy 可以使用一枚可以設定半徑的炸彈,可以設定乙個不超過rr的範圍,然後選擇平面上的乙個點引爆,範圍內的所有敵人全部消滅。
當然,由於炸彈威力巨大,如果**範圍接觸到 jyy 的建築,那麼 jyy 的建築也會受到損傷。(注:如果炸彈的**範圍僅接觸到了 jyy 建築的邊界,則不會對 jyy 的建築造成損傷;如果敵人出現在了**範圍的邊界,則該敵人被消滅)jyy 可以自由控制炸彈的**地點和**半徑。作為乙個保守的玩家,他希望在保證自己建築毫髮無損的情況下,消滅盡量多的敵人。
輸入格式
第一行包含三個非負整數,分別為n,m,rn,m,r;
接下來nn行,每行三個整數,其中第ii行為x_i,y_i,r_ixi
,yi ,ri
,表示第ii個建築的位置和半徑。資料保證所有建築不相交(但是有可能邊界接觸);
接下來mm行,每行兩個整數,其中第ii行為p_i,q_ipi
,qi ,表示第ii個敵人的位置。
輸出格式
輸出一行乙個整數,表示 jyy 最多可以消滅的敵人數量。
輸入輸出樣例
輸入 #1複製
1 5 3
0 0 1
3 3-3 3
3 -3
3 00 3
輸出 #1複製
3說明/提示
對於2020%的資料,滿足mm==22;
對於另外2020%的資料,滿足nn==00;
對於另外2020%的資料,滿足mm\leq≤5050;
對於100100%的資料,滿足
00\leq≤nn\leq≤1010,00<11\leq≤r,r_ir,ri
\leq≤22\times×10^410
4,|p_i|∣pi
∣,|q_i|∣qi
∣,|x_i|∣xi
∣,|y_i|∣yi
∣\leq≤22\times×10^4104。
①將改動座標時的rand對乙個合適大小的數取模,例如本題,我用的是500,這樣可以防止隨機的移動過於不穩定;
②手算一下t的上下界,當t過大過小時都難以找到更優解,這樣減小了t的範圍,剩下時間可以多sa幾次;
③對於本題我們還可以在遇到次優解判斷是否接受時除以根號t(然而貌似這樣不符合物理定義),因為t的變化較大,這樣確保在t較小時也有可能更新,t較大時也不會全盤接受。
這樣優化之後自測能連過十幾次沒wa,ac率應該至少有90%了,而且最大點也才500+ms,不會t掉
#include
#define esp 1e-10
#define dt 0.998
using
namespace std;
struct buildingbld[20]
;struct enemyenm[
1010];
int n,m,r,ans1,ans2;
double sumx,sumy;
double
dist
(double x1,
double y1,
double x2,
double y2)
intdeal
(double x,
double y)
for(
int i=
1;i<=m;i++
)return sum;}/
voidsa(
)elseif(
exp(
-delta/t)
*rand_max<
rand()
) t*
=dt;}}
intmain()
for(
int i=
1;i<=m;i++
) sumx/
=m,sumy/
=m;for
(int i=
1;i<=
6;i++)sa
();printf
("%d\n"
,ans2)
;return0;
}
JSOI2016 炸彈攻擊(模擬退火)
模擬退火居然不出題答,這個出題人腦子進水了。由最小圓覆蓋那一套,最優的圓是以上三種情況之一 1.乙個答案點就是圓,半徑 0 2.兩個點連成的線段為直徑的圓 3.三點共園 直接列舉,判斷是 o m 4 的。可能可以優化掉乙個 m 然後你發現做不下去了。考慮退火,這個題直接以覆蓋的點數作為價值退火是不太...
JSOI2016 炸彈攻擊Attack
炸彈攻擊 故事背景 jyy 最近迷上了一款塔防遊戲,在遊戲裡 jyy 除了建設建築,還可以使用 炸彈對螢幕上的敵人進行範圍殺傷。問題描述 遊戲地圖可以簡單認為是乙個 2 維平面。jyy 建造了 n 個建築,每個建築都是乙個圓,其中第 i 個建築的圓心位於 x y 且半徑為r 地圖上一共有 m 個敵人...
JSOI2016 最佳團隊
這種最大化形如 x y 的式子的題,很容易想到分數規劃。二分答案,對於當前的mid,設d i p i mid s i 考慮到當乙個節點i被選,那麼fa i 也要被選,那麼乙個想法是選取當前最大的d,然後把它的兒子的d放入堆裡。但是這個方法是錯誤的 然而我一開始就這麼打了,只有10分 題目給出的是一棵...