JSOI2016 炸彈攻擊(模擬退火)

2022-05-01 04:57:11 字數 1162 閱讀 2772

模擬退火居然不出題答,這個出題人腦子進水了。

由最小圓覆蓋那一套,最優的圓是以上三種情況之一:

1.乙個答案點就是圓,半徑—>0

2.兩個點連成的線段為直徑的圓

3.三點共園

直接列舉,判斷是\(o(m^4)\)的。

可能可以優化掉乙個\(m\),然後你發現做不下去了。

考慮退火,這個題直接以覆蓋的點數作為價值退火是不太行的。

當價值相同時,應取當前圓的最大半徑作為第二關鍵字。

然後調整發現,應該使往劣的方向走的概率變小。

這麼個連樣例都吃力的做法它能過。

code:

#include#define fo(i, x, y) for(int i = x, _b = y; i <= _b; i ++)

#define ff(i, x, y) for(int i = x, _b = y; i < _b; i ++)

#define fd(i, x, y) for(int i = x, _b = y; i >= _b; i --)

#define ll long long

#define pp printf

#define hh pp("\n")

using namespace std;

#define db double

const int n = 1005;

int n, m;

db r, r[n];

struct p

} a[n], b[n];

#define sqr(x) ((x) * (x))

db dis(p a, p b)

ll rand(ll x, ll y)

db rd()

const db eps = 1e-8;

p calc(p c)

int main()

if(v1.x == v2.x)

if(exp((db) (v2.y - v1.y) / t) / 10 * 1e9 > rand(1, 1e9))

continue;

}if(exp((db) (v2.x - v1.x) / t) / 10 * 1e9 > rand(1, 1e9))

} }pp("%d\n", ans);

}

模擬退火 JSOI2016 炸彈攻擊1

題目背景 jyy 最近迷上了一款塔防遊戲,在遊戲裡 jyy 除了建設建築,還可以使用炸彈對螢幕上的敵人進行範圍殺傷。題目描述 遊戲地圖可以簡單認為是乙個二維平面。jyy 建造了nn個建築,每個建築都是乙個圓,其中第ii個建築的圓心位於 x i,y i xi yi 且半徑為r iri 地圖上一共有mm...

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分 題目給出的是一棵...