zoukankan      html  css  js  c++  java
  • Ants 解题报告

    • 问题描述:An army of ants walk on a horizontal pole of length l cm, each with a constant speed of 1 cm/s. When a walking ant reaches an end of the pole, it immediatelly falls off it. When two ants meet they turn back and start walking in opposite directions. We know the original positions of ants on the pole, unfortunately, we do not know the directions in which the ants are walking. Your task is to compute the earliest and the latest possible times needed for all ants to fall off the pole.大意如下:在一根1cm长的棍子上有一群蚂蚁,每个蚂蚁的速度是1cm/s。当蚂蚁到达端点的时候就会掉下去。当两个蚂蚁相碰后就会各自调头向相反的方向走.我们知道蚂蚁的初始位置但是不知道让它们的初始方向。要计算所以蚂蚁都掉下去的最短时间和最长时间。
    • 问题分析:假如有n个蚂蚁在棍子上,每个蚂蚁的朝向共有两种,那么就一共有2n中情况分析,显然这样每种情况都分析很繁琐,题目中也只需要求出最小值和最大值即最简单和最复杂的情况。那么这两种情况分别是怎样的呢?首先要理清出两个概念:我们假设棍子的长度为l,当只有一个蚂蚁是,那么蚂蚁在棍子上的任何位置,对于蚂蚁走向端点时有两种选择,显然可知它走向最近的一端的距离lmin一定属于[0,l/2],那么最远的一端的距离是lmax一定属于[l/2,l].由于随机性,每个蚂蚁的初始朝向我们都无法预知,假设当两个蚂蚁的朝向不同时那么他们在想向靠近的过程中必然会碰头然后再掉头,这必然会比让他们朝向不同时不碰头分别走到各自的端点麻烦。所以最简单的情况就是都朝着离自己初始位置最近的一端走。每个蚂蚁都不会碰头。相反最复杂的情况就是每个蚂蚁都朝离自己最远的一端走。那么在分析他们相遇时如下: 假设蚂蚁a在左边,蚂蚁b在右边,当他们相遇时a会调头向左走,b会调头向右走。设想一下如果a与b在交换位置,那么a调头后走的距离就是b不调头继续向前走的距离,同理b调头后走的距离就是a不调头继续向前走的距离。所以调头后两者走的距离之和就是两者在不调头的情况下都朝各自远端的距离之和.(如果不理解可以画图加深理解).对于题目中要求的最早时间和最迟时间分别最优情况和最复杂的情况.在最优情况下,每个蚂蚁都朝离最近的一段走,那么该值lmin一定属于[0,l/2],lmax一定属于[l/2,l](可以用这个结论来验证自己的结果是否正确).
    • 经过上述分析,程序代码如下:
       1 #include <stdio.h>
       2 #include <malloc.h>
       3 int main()
       4 {
       5   int i,test,length,number_ant,max_length,min_length;
       6   int *number;
       7   scanf("%d",&test);
       8   while(test > 0)
       9     {
      10       scanf("%d %d",&length,&number_ant);
      11       max_length = 0; min_length = 0;
      12       number = (int*)malloc(sizeof(int)*number_ant);
      13       for(i = 0; i < number_ant; i++)
      14     {
      15       scanf("%d",&number[i]);
      16       if(number[i] < (length/2))
      17         {
      18           if(number[i] > min_length)
      19         min_length = number[i];
      20               if((length-number[i]) > max_length)
      21                 max_length = length - number[i];
      22         }
      23       else if(number[i] >= (length/2))
      24         {
      25               if((length-number[i]) > min_length)
      26         min_length = length-number[i];
      27           if(number[i] > max_length)
      28         max_length = number[i];
      29         }
      30     }
      31       printf("%d %d
      ",min_length,max_length);
      32       test--;
      33     }
      34   return 0;
      35 }
    • 程序分析和总结:在编码中遇到了以下几个问题:1)我最开始把每个蚂蚁的距离都相加求和了。显然题目中不是要求所有蚂蚁到达端点的距离和,虽然所有蚂蚁都是同时在移动,但是要求的是最后一个蚂蚁到达端点的距离(最后一个到达端点的蚂蚁的距离把比它早到的蚂蚁的距离覆盖了都比它们的距离大)2)把最优情况下求成了最小值。仔细分析,题目要求的所有蚂蚁到达端点的最小时间,就是所有蚂蚁都朝近端点走时最后一个到达端点的蚂蚁所走的距离,显然是最优情况下的最大值。最优情况下的最小值是第一个到达端点的蚂蚁所走的距离。本题的难点是分析清楚两者相遇时距离的计算方法,知道了这点该问题就可以迎刃而解了。
  • 相关阅读:
    SSL/TLS原理详解
    HTTPS 为什么更安全,先看这些
    浏览器缓存策略
    HTTPS的中那些加密算法
    双飞翼圣杯布局
    Bootstrap中container与container-fluid的区别
    连接无线设备——与Wi-Fi直接连接
    Android网络通信之WiFi Direct
    【Android】 Android-wifi 直连 wifi direct wifi p2p
    django 过滤器 、日期格式化参数
  • 原文地址:https://www.cnblogs.com/programmer-cjr/p/3722492.html
Copyright © 2011-2022 走看看