(eden)Ant
题目名称
Ant
题目描述
一根长度为L厘米的木棒上有N只蚂蚁,每只蚂蚁要么向左走,要么向右走,速度为1厘米/秒。当两只蚂蚁相撞时,他们会同时掉头(掉头时间不计)给出每只蚂蚁距离木棒左端的距离,问多少秒后,刚好所有蚂蚁都从木棒上掉下来。
N 和 L均不超过1000
输入第一行两个整数,分别是N和L
接下来N行,每行先是一个字符,L或R,代表向左还是向右,然后是一个整数x,代表这个蚂蚁距离木棒左端的距离。
样例输入:
4 10
R 1
R 5
L 3
R 9
样例输出:
9
HINT
假设你在远处观察两只蚂蚁相向而行,他们相撞后掉头,和直接穿过有什么区别?
题目难度
1
我的理解
这个题目的提示太给力了,不然看完题目之后我都没想到该怎么做==,问刚好多少秒之后,所有蚂蚁从上面掉下来即让我们求最后一只蚂蚁掉下来是多少秒,也就是用时最长的蚂蚁用了多长的时间在上面走。
方法&解释
看了提示后,只要知道这题怎么解,方法就很轻松了,因为实际上每一只蚂蚁相碰之后掉头行走,你可以把他们掉头行走实际上看做是他们还是按照原来的方向行走,完全不影响,因为假设A蚂蚁和B蚂蚁是相向而行的,那么A蚂蚁和B蚂蚁在调头之前经过的时间是一样的,然后在相碰之后,A,B均调头行走,但是实际上可以把A看做B,把B看做A,他们还是按照原路行走,完全不影响,可以相当于他们并未相碰只是一直按照原来的方向往前走,虽然碰后继续走A的路程的是B,但是B还是用A原本没有相碰的相同时间把A接下来本来直行的路程走完,所以A走前半部分和B走后半部分与A直行的时间是一样的,而我们只考虑时间,所以就可以相当于所有蚂蚁在碰后不掉头依旧原路行驶,这样的话,我们只需要求得最开始离他们的终点(木条的左端和木条的右端,注意两边都可以掉下去)最远的蚂蚁的距离,所以贪心法就可以了。
我的代码
1 #include<stdio.h> 2 int main() { 3 int n, l; 4 scanf("%d%d", &n, &l); 5 int i, t, max = 0; 6 char ch; 7 for (i = 1; i <= n; i++) { 8 char j = getchar(); //因为每一次每一行后面都有一个'\n'所以要用getchar()把回车去掉否则会影响输入 9 scanf("%c", &ch); 10 j = getchar();//把空格去掉==标程处理的比我的更好 11 scanf("%d", &t); 12 if (ch == 'R') { 13 t = l - t;//因为题目所给的是到木条左端的距离,所以减掉就是往右走的掉下来的距离 14 } 15 if (t > max) max = t;//贪心得到最大值 16 } 17 printf("%d\n", max); 18 }
标程
1 #include<stdio.h> 2 int main() { 3 int n, l, x, sum = 0, i; 4 char s[11]; 5 scanf("%d%d", &n, &l); 6 for (i = 1; i <= n; i++) { 7 scanf("%s%d", s, &x);//标程这样读入比我的好,因为不会有换行符和空格影响,“%s”的读入不同 8 if (s[0] == 'R') x = l - x; 9 if (x > sum) sum = x; 10 } 11 printf("%d\n", sum); 12 return 0; 13 }
标程解释
在标程的注释上
出现的问题和需要进一步学习的地方
问题:
提交了三次才过主要是因为
①在处理字符输入上面出现了问题不知道每一行回车符也会被scanf("%c")读入,还有空格,所以还要想到把每一行的回车符getchar()掉,这里标程比我做得好;
另外就是
②题目的思路了,最开始一直局限与怎么弄相碰之后返回,然后求最大的时间,最长的距离,看到了提示恍然大悟...这个思路很巧妙,有时候真的不能够局限于一个地方,因为它转了很多次向之后一只小蚂蚁它的距离可能是增加了,但是整体来看,时间并没有改变,因为有另一只蚂蚁代替它继续走了这一条路,前面的时间相同,而后面走这一条路的时间还是用原本应该的相同时间,所以最后这一条路的时间并没有改变。或者可以往这个方面去想:就是不以蚂蚁为对象,我们把路程当做对象,最开始每只蚂蚁给定的路程已经给出,我们即使求最长的路程,因为每次蚂蚁碰撞之后,交换方向但是每一次每一条路程都会有蚂蚁继续走下去,时间没有暂停也没有延续,所以求最长时间也就是求最长路程,对的,这个思路也很好理解。
需要学习的地方:
从这道题可以看出
①对字符输入输出scanf("%s%c")这些基础都还不是很理解;
②还有getchar(),puts()这些基本的输入输出语句都不清楚;
③思考问题可以换一个角度;
④要将以上两个问题总结一下,弄清楚基本输入输出和字符的处理。