这题只要有想象力就能很简单过
题意:
一根n厘米长的线上有多只蚂蚁,蚂蚁顺着线走,但方向不知道,如果两只蚂蚁碰到一起就都掉头然后继续前进直到从线的两端掉下。蚂蚁每次移动的速度为1cm/s 。要求输出所有蚂蚁都掉下去需要用的最短时间和最长时间
思路:
- 时间最短:如果所有蚂蚁都不会互相碰到一起就不会额外产生多余的步数,则以线长度的中值为界,左边的都往左走,右边的都往右走,这样所有蚂蚁都不会碰到一起而且每只蚂蚁走的时间都是最短的。所以时间最短的只需要看离中值最近的一只蚂蚁要走的时间即可
- 时间最长:任意两只蚂蚁碰到一起后掉头再继续行走,可以想象无视掉头,不用刻意考虑具体哪一只蚂蚁是怎样走的,碰到一起后因为两只蚂蚁所走的路之和是不变的,则不用考虑掉头,蚂蚁继续往前走直到端点,仍然以线长度的中值为界,左边的都往右走,右边的都往左走,这样每一只蚂蚁都走了最长的距离也就是最费时间的。所以时间最长的只需要看离中间值最远(离端点最近)的一只蚂蚁要走的时间即可
完整代码如下:
#include<stdio.h>
int main() {
int t ;
int len, num, mid ;
int minL, minR, maxL, maxR ;
int data[1000500] ;
scanf("%d", &t) ;
while(t--) {
scanf("%d%d", &len, &num) ;
mid = len / 2 ; //线长度的中间值
minL = minR = maxR = 0 ;
maxL = 99999999 ;
for(int i=0; i<num; i++) {
scanf("%d", &data[i]) ;
if(data[i] < maxL) //找离左端点最近的点
maxL = data[i] ;
if(data[i] > maxR) //找离右端点最近的点
maxR = data[i] ;
if(data[i]>mid && (len-data[i])>minR) //找中值右边离中值最近的点
minR = len - data[i] ;
if(data[i]<=mid && data[i]>minL) //找中值左边离中值最近的点
minL = data[i] ;
}
printf("%d %d\n", (minL>minR ? minL:minR), ((len-maxL)>maxR ? (len-maxL):maxR)) ; //输出离中值最近的点和最远的点
}
return 0 ;
}
总结:
拿到这样的模拟题,不要急着死板的按照题目的要求一步一步做,这种题肯定不后让你用很复杂的方式来解决一定都有巧妙地地方,多想象,多画图,灵活一点。也可以观察样例,本题的样例是:
输入
214 7
11 12 7 13 176 23 191
输出
38 207
样例中最小时间就是线的长度214减去最接近中值的176的答案,最大时间就是线的长度214减去离中值最远的11的答案。我做题的时候就是凭感觉按照这样的思路慢慢摸索出来,这样的方式有一定的偶尔性但有时候还是会提供一点灵感