一个环形公路,上面有N个站点,A1, ..., AN,其中Ai和Ai+1之间的距离为Di,AN和A1之间的距离为D0。 高效的求第i和第j个站点之间的距离,空间复杂度不超过O(N)。

//点数
#define N 10

//点间距
int D[N];

//A1到每个Ai的距离
int A1ToX[N];

void preprocess() {
	srand(time(0));

	//随机分配每个点间的距离
	for (int i = 0; i < N; ++i) {
		D[i] = rand() % (RAND_MAX + 1) * N;
	}

	/*A1ToX[i]:A1到每个点Ai的距离*/
	//A1到A2的距离
	A1ToX[1] = D[1];
	for (int i = 2; i < N; ++i) {
		A1ToX[i] = A1ToX[i - 1] + D[i];
	}

	//全长
	A1ToX[0] = A1ToX[N - 1] + D[0];
}

int getDistance(int i, int j) {
	int disI = i == 0 ? 0 : A1ToX[i - 1];
	int disJ = j == 0 ? 0 : A1ToX[j - 1];
	int dis = abs(disI - disJ);
	//环形公路,每个点存在2条路径,取最短的
	return (dis > A1ToX[0] / 2) ? A1ToX[0] - dis : dis;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值