给定
不难发现问题可以转化为,我们要选择一个点,求使得这个点能够到达其它所有点的最大代价,然后求所有起点最大代价的最小值,这东西有点像全源最短路,且数据范围很小。于是不难想到一步转化,可以将原不等式转化为
xxxxxxxxxx66123
45678910
11using namespace std;12
13mt19937 rnd(random_device{}());14int rndd(int l, int r){return rnd() % (r - l + 1) + l;}15bool rnddd(int x){return rndd(1, 100) <= x;}16
17typedef unsigned int uint;18typedef unsigned long long unll;19typedef long long ll;20typedef long double ld;21
22template < typename T = int >23inline T read(void);24
25int N;26struct Node{ll x, y, p;}nod[300];27ll dis[300][300];28ll ans(LONG_LONG_MAX);29
30int main(){31 N = read();32 for(int i = 1; i <= N; ++i)nod[i].x = read(), nod[i].y = read(), nod[i].p = read();33 for(int i = 1; i <= N; ++i)34 for(int j = 1; j <= N; ++j)35 if(i == j)dis[i][j] = 0;36 else37 dis[i][j] = (ll)ceil((ld)(abs(nod[i].x - nod[j].x) + abs(nod[i].y - nod[j].y)) / (ld)nod[i].p),38 dis[j][i] = (ll)ceil((ld)(abs(nod[i].x - nod[j].x) + abs(nod[i].y - nod[j].y)) / (ld)nod[j].p);39 for(int k = 1; k <= N; ++k)40 for(int i = 1; i <= N; ++i)41 for(int j = 1; j <= N; ++j)42 dis[i][j] = min(dis[i][j], max(dis[i][k], dis[k][j]));43 for(int s = 1; s <= N; ++s){44 ll mx(-1);45 for(int t = 1; t <= N; ++t)mx = max(mx, dis[s][t]);46 ans = min(ans, mx);47 }printf("%lld\n", ans);48 fprintf(stderr, "Time: %.6lf\n", (double)clock() / CLOCKS_PER_SEC);49 return 0;50}51
52template < typename T >53inline T read(void){54 T ret(0);55 int flag(1);56 char c = getchar();57 while(c != '-' && !isdigit(c))c = getchar();58 if(c == '-')flag = -1, c = getchar();59 while(isdigit(c)){60 ret *= 10;61 ret += int(c - '0');62 c = getchar();63 }64 ret *= flag;65 return ret;66}update-2022_12_09 初稿