这里我就不给大家陈述题目了,直接先说解题思想:
首先由题意知如果两个人相对而行碰面就会转身,那么我们假如甲和乙一个向左一个向右,正好碰面,那么此时甲乙转身,变成甲向右,乙向左,或许你看到这有一点思路就是可以算最短时间,毕竟只要不出现相撞并且根据中间点分开向左,向右就可以了;那么最大值呢?肯定存在相遇。
那我们怎么解决呢?其实可以回想一下数学知识,这些人和桥可不可以比作数学上的点和数轴,而下桥的地方就是数轴的两端点,所以点到两端点的距离不就是时间的大小吗?如果这还听不懂,那我们可以这样想如果甲乙相遇后,甲乙不仅行走的方向,并且身份互换了,那这对他们有影响吗?
仔细想一下并没有影响?所以不就可以把这样数学化吗?
首先呈现的是我第一段代码
#include<stdio.h>
#include<stdlib.h>
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<a) {
scanf("%d", &arr[j]);
j++;
}
if (a > 0){
while (i < a) {
if (arr[i] <n / 2) {
brr[x] = arr[i];
x++;
}
else 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<stdio.h>
#include<stdlib.h>
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;
}
代码量大大减少了一大半,但理解起来就更加有一点难度。但这样可以大大加快我们写出题的速度。这就是算法思维和数学思想是否清晰的表现,别人或许十几二十行写出的代码,但你可能写五六十行才完成,要多锻炼自己才可以。
文章讲述了如何将两人过桥问题抽象为数学模型,通过代码示例展示了从初始混乱思路到清晰算法的改进过程,强调了算法思维在简化问题解决中的重要性。

被折叠的 条评论
为什么被折叠?



