洛谷独木桥---算法思维和数学思想

这里我就不给大家陈述题目了,直接先说解题思想:

首先由题意知如果两个人相对而行碰面就会转身,那么我们假如甲和乙一个向左一个向右,正好碰面,那么此时甲乙转身,变成甲向右,乙向左,或许你看到这有一点思路就是可以算最短时间,毕竟只要不出现相撞并且根据中间点分开向左,向右就可以了;那么最大值呢?肯定存在相遇。

那我们怎么解决呢?其实可以回想一下数学知识,这些人和桥可不可以比作数学上的点和数轴,而下桥的地方就是数轴的两端点,所以点到两端点的距离不就是时间的大小吗?如果这还听不懂,那我们可以这样想如果甲乙相遇后,甲乙不仅行走的方向,并且身份互换了,那这对他们有影响吗?

仔细想一下并没有影响?所以不就可以把这样数学化吗?

首先呈现的是我第一段代码

#include
#include
int sc(const int* e1, const int* e2) {
	if (*e1 == *e2) {
		return 0;
	}
	else if (*e1 > *e2)
		return 1;
	else return -1;

}
int main() {
	int a, x = 0, y = 0, i = 0, z = 0,n,j=0;
	int arr[10005] = { 0 }, brr[10005] = { 0 }, crr[10005] = { 0 }, drr[10005] = {0};
	scanf("%d\n", &n);
	scanf("%d\n", &a);
	while(j 0){
		while (i < a) {
			if (arr[i]  n / 2) {
				crr[y] = arr[i];
				y++;
			}
			else drr[z] = arr[i];
			i++;

		}
		qsort(brr, x, sizeof(brr[0]), sc);
		qsort(crr, y, sizeof(crr[0]), sc);
		if (crr[0] != 0 && brr[0] == 0) {
			y--;
		}
		else if (crr[0] == 0 && brr != 0) {
			x--;
		}
		else if(crr[0]!=0&&brr[0]!=0) {
			x--;
			y--;
		}
		if (drr[z] != 0) {
			printf("%d", drr[0]);
		}
		else {
			if (brr[x] > n - crr[0] + 1)
				printf("%d", brr[x]);
			else printf("%d", n - crr[0] + 1);
		}
		if (brr[x] != 0 && crr[y] != 0) {
			if (n - brr[0] + 1 >= crr[y]) {
				printf(" %d", n - brr[0] + 1);
			}
			else printf(" %d", crr[y]);
		}
		else if (brr[x] != 0 && crr[y] == 0) {
			printf(" %d", n - brr[0] + 1);
		}
		else printf(" %d", crr[y]);
}
	else printf("0 0");
	return 0;
}

这是我第一次写的代码,看起来很杂乱,但是这可以通过测试。。。虽然看着混乱,但是如果仔细看的话,很容易理解,但这都是慢慢测试不全的,主要是那是思维不是很清楚,就造成这样了。

然后我们再来看一下我思维十分清晰是写出的代码

#include
#include
int sc(const int* e1, const int* e2) {
	if (*e1 > *e2) {
		return 1;
	}
	else if (*e1 == *e2) {
		return 0;
	}
	else return -1;
	}
int main() {
	int n, a,ret1,ret;
	int arr[10005] = { 0 }, brr[10005] = { 0 };
	scanf("%d%d\n", &n, &a);
	if (a > 0) {
		for (int j = 0;j < a;j++) {
			scanf("%d", &arr[j]);
		}
		qsort(arr, a, sizeof(arr[0]), sc);
		for (int i = 0;i < a;i++) {
			brr[i] = (arr[i] > n / 2) ? n - arr[i] + 1 : arr[i];
		}
		qsort(brr, a, sizeof(brr[0]), sc);
		ret1 = brr[a - 1];
		ret = (n - arr[0] + 1 > arr[a - 1]) ? n + 1 - arr[0] : arr[a - 1];
		printf("%d %d", ret1, ret);
	}
	else printf("0 0");
	return 0;
}

代码量大大减少了一大半,但理解起来就更加有一点难度。但这样可以大大加快我们写出题的速度。这就是算法思维和数学思想是否清晰的表现,别人或许十几二十行写出的代码,但你可能写五六十行才完成,要多锻炼自己才可以。

你可能感兴趣的:(算法,c语言)