zoukankan      html  css  js  c++  java
  • (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()这些基本的输入输出语句都不清楚;

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

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

  • 相关阅读:
    QTreeWidget创建
    Qt QTreeWidget节点的添加+双击响应+删除详解(转)
    Qt QTreeWidget 树形结构实现(转)
    QMessageBox类学习:
    QAction类详解:
    Qt事件和信号的区别 .
    Qt消息机制和事件(二)
    Qt消息机制和事件(一)
    初步开始学习图
    图中最短路径算法(Dijkstra算法)(转)
  • 原文地址:https://www.cnblogs.com/iamxiaoyubei/p/5035178.html
Copyright © 2011-2022 走看看