(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(); //因为每一次每一行后面都有一个'
'所以要用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
", 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
", sum);
12     return 0;
13 }

标程解释

      在标程的注释上

出现的问题和需要进一步学习的地方

      问题

       提交了三次才过主要是因为

       ①在处理字符输入上面出现了问题不知道每一行回车符也会被scanf("%c")读入,还有空格,所以还要想到把每一行的回车符getchar()掉,这里标程比我做得好;

       另外就是

       ②题目的思路了,最开始一直局限与怎么弄相碰之后返回,然后求最大的时间,最长的距离,看到了提示恍然大悟...这个思路很巧妙,有时候真的不能够局限于一个地方,因为它转了很多次向之后一只小蚂蚁它的距离可能是增加了,但是整体来看,时间并没有改变,因为有另一只蚂蚁代替它继续走了这一条路,前面的时间相同,而后面走这一条路的时间还是用原本应该的相同时间,所以最后这一条路的时间并没有改变。或者可以往这个方面去想:就是不以蚂蚁为对象,我们把路程当做对象,最开始每只蚂蚁给定的路程已经给出,我们即使求最长的路程,因为每次蚂蚁碰撞之后,交换方向但是每一次每一条路程都会有蚂蚁继续走下去,时间没有暂停也没有延续,所以求最长时间也就是求最长路程,对的,这个思路也很好理解。

      需要学习的地方:

      从这道题可以看出

      ①对字符输入输出scanf("%s%c")这些基础都还不是很理解;

      ②还有getchar(),puts()这些基本的输入输出语句都不清楚;

      ③思考问题可以换一个角度;

      ④要将以上两个问题总结一下,弄清楚基本输入输出和字符的处理。

原文地址:https://www.cnblogs.com/iamxiaoyubei/p/5035178.html