两题很有趣挺经典的蚂蚁问题。

1.n只蚂蚁以1cm/s的速度在长为L的竿上爬行,当蚂蚁爬到竿子的端点就会掉落。当两只蚂蚁相撞时,只能各自反向爬回去。对于每只蚂蚁,给出距离左端的距离xi,但不知道它的朝向,求所有蚂蚁落下竿子所需要的时间的最大值和最小值。

2.问题1的升级版:把问题1改为已知每只蚂蚁的左端距离和它的朝向,要求按输入顺序输出 t 秒后每只蚂蚁的位置和状态(掉出去,转向中,或者蚂蚁的朝向)。

1.POJ 1852 Ants

http://poj.org/problem?id=1852

思路:

很水的一题,因为以前做过问题2.so......

因为蚂蚁碰撞会反向,故我们可以直接看成是蚂蚁直接穿过去。

也就是说,这道题求解只需要独立的计算出每只蚂蚁到端点的时间即可。

最小时间只需要沿着靠近的一端走,最大时间则最远的一端。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. int a,L,n;
  6. int main()
  7. {
  8. int T;
  9. scanf("%d",&T);
  10. while(T--)
  11. {
  12. int min_ans=0,max_ans=0;
  13. scanf("%d%d",&L,&n);
  14. for(int i=0;i<n;i++)
  15. {
  16. scanf("%d",&a);
  17. min_ans=max(min_ans,min(L-a,a)); //选择小的一段走
  18. max_ans=max(max_ans,max(L-a,a)); //选择长的一段走
  19. //因为是计算总的时间故应取最大值。
  20. }
  21. printf("%d %d\n",min_ans,max_ans);
  22. }
  23. return 0;
  24. }

2.UVA 10881 - Piotr's Ants

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1822

思路:

《算法竞赛入门经典-训练指南》上的题。

半年前被虐个半死,今天是我把他虐个半死。

和问题1的差别在于要求出位置。

那么,同样的,每只蚂蚁碰撞后反向,所以每只蚂蚁的相对顺序不变。(突然想起“不撞南墙不回头”。。。。。。。)

所以我们根据一开始排个序,记录此时所有蚂蚁的序号,然后计算ts后的位置。(计算我们直接加上距离,你想,0s有一只向右的位置在x的,那么ts后一只向右的位置在x+t的,不管是不是一开始向右的那只还是和他碰撞的,我们可以看为穿过去)

接下来再次根据位置排序,将序号进行“还原”,即对应上原来在竿上的位置。

最后根据序号按顺序输出即可。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. const int MAXN=10000+10;
  6. int L,t,n;
  7. int order[MAXN];
  8. char string[][10]={"L","R","Turning"};
  9. struct data
  10. {
  11. int id; //输入的顺序
  12. int x; //位置
  13. int dir; //方向 0 左 1右 2碰撞
  14. bool operator<(const data &y)const{
  15. return x<y.x;
  16. }
  17. }a[MAXN];
  18. bool cmp(const data& x,const data&y)
  19. {
  20. return x.id<y.id;
  21. }
  22. int main()
  23. {
  24. int T,kase=1;
  25. scanf("%d",&T);
  26. while(T--)
  27. {
  28. scanf("%d%d%d",&L,&t,&n);
  29. for(int i=0;i<n;i++)
  30. {
  31. char dir;
  32. scanf("%d %c",&a[i].x,&dir);
  33. if(dir=='L') a[i].dir=0;
  34. else a[i].dir=1;
  35. a[i].id=i;
  36. }
  37. //每只蚂蚁的相对次序是不变的,原来在左边的之后还会在左边。
  38. sort(a,a+n);
  39.  
  40. for(int i=0;i<n;i++)
  41. {
  42. order[i]=a[i].id;
  43. if(a[i].dir==0)
  44. a[i].x-=t;
  45. else
  46. a[i].x+=t;
  47. }
  48. //再次排序即可由最后的位置确定对应的输入序号(相对位置不变)
  49. sort(a,a+n);
  50. for(int i=0;i<n-1;i++)
  51. {
  52. a[i].id=order[i];
  53. if(a[i].x==a[i+1].x)
  54. a[i+1].dir=a[i].dir=2;
  55. }
  56. a[n-1].id=order[n-1];
  57.  
  58. sort(a,a+n,cmp); //根据输入的顺序排序
  59. printf("Case #%d:\n",kase++);
  60. for(int i=0;i<n;i++)
  61. {
  62. if(a[i].x<0||a[i].x>L) //掉出去了
  63. printf("Fell off\n");
  64. else
  65. printf("%d %s\n",a[i].x,string[a[i].dir]); //根据方向输出状态。
  66. }
  67. printf("\n");
  68. }
  69. return 0;
  70. }

POJ 1852 Ants || UVA 10881 - Piotr's Ants 经典的蚂蚁问题的更多相关文章

  1. UVA.10881 Piotr's Ants (思维题)

    UVA.10881 Piotr's Ants (思维题) 题意分析 有一根长度为L cm的木棍,上有n只蚂蚁,蚂蚁要么向左爬,要么向右,速度均为1cm/s,若2只蚂蚁相撞,则蚂蚁同时调头.求解第T秒时 ...

  2. 思维题 UVA 10881 Piotr's Ants

    题目传送门 /* 题意:在坐标轴上一群蚂蚁向左或向右爬,问经过ts后,蚂蚁的位置和状态 思维题:本题的关键1:蚂蚁相撞看作是对穿过去,那么只要判断谁是谁就可以了 关键2:蚂蚁的相对位置不变 关键3:o ...

  3. cogs 1456. [UVa 10881,Piotr's Ants]蚂蚁

    1456. [UVa 10881,Piotr's Ants]蚂蚁 ★   输入文件:Ants.in   输出文件:Ants.out   简单对比时间限制:1 s   内存限制:128 MB [题目描述 ...

  4. UVA 10881 Piotr's Ants(等效变换 sort结构体排序)

    Piotr's AntsTime Limit: 2 seconds Piotr likes playing with ants. He has n of them on a horizontal po ...

  5. [ACM_模拟] UVA 10881 Piotr's Ants[蚂蚁移动 数组映射 排序技巧]

    "One thing is for certain: there is no stopping them;the ants will soon be here. And I, for one ...

  6. UVA 10881 - Piotr's Ants【模拟+思维】

    题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  7. uva 10881 Piotr's Ants 解题报告

    题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=20&pa ...

  8. Uva 10881 Piotr’s Ants 蚂蚁

    一根长度为 L 厘米的木棍上有 n 只蚂蚁,每只蚂蚁要么朝左爬,要么朝右爬,速度为 1 厘米/秒.当两只蚂蚁相撞时,二者同时调头(掉头用的时间忽略不计).给出每只蚂蚁的初始位置和朝向,计算 T 秒之后 ...

  9. uva 10881 - Piotr's Ants

    这个题的突破点就在于蚂蚁不能够穿过对方,故相对位置不变: 另外,又可以把蚂蚁看成运动方向不变: 代码: #include<cstdio> #include<algorithm> ...

随机推荐

  1. win10 WmiPrvSE.exe WMI Provider 占用CPU过高的问题

    重启 Windows Management Instrumentation 服务 重启 WMI service.   + ,输入: "services.msc" ,按 . 在 服务 ...

  2. iOS定制改动navigation的backbutton

    iOS开发中.navigation的返回button是英文"back".想改动成中文"返回"或者自己定义的文字.这么简单的事情却折腾了小半个小时.原来是被lef ...

  3. Bmob移动后端云服务平台--Android从零開始--(一)何为Bmob

    Bmob移动后端云服务平台--Android从零開始--(一)何为Bmob 在正式的项目开发中,单client不能满足我们的需求,须要实现client与服务端的连接. 而在编写Android服务端代码 ...

  4. windows10系统下设置mtu值的方法

     windows10系统下设置mtu值的方法 http://www.xitongcheng.com/jiaocheng/win10_article_34701.html 以下为服务器上使用  ip ...

  5. javascript进阶教程第一章案例实战

    javascript进阶教程第一章案例实战 一.学习任务 通过几个案例练习回顾学过的知识 通过练习积累JS的使用技巧 二.实例 练习1:删除确认提示框 实例描述: 防止用户小心单击了“删除”按钮,在用 ...

  6. HTTP基础知识整理

    http请求由三部分组成,分别是:请求行.消息报头.请求正文 HTTP(超文本传输协议)是一个基于请求与响应模式的.无状态的.应用层的协议,常基于TCP的连接方式,HTTP1.1版本中给出一种持续连接 ...

  7. 二分图简单概念&&HDU 2063

    二分图: 二分图又称作二部图,是图论中的一种特殊模型. 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同 ...

  8. 【DRF版本】

    目录 使用内置的URLPathVersioning类 使用自定义的版本控制类 首先,我们开发的项目会有多个版本. 其次,我们的项目版本会随着更新越来越多,我们不可能因出了新版本就不维护旧版本了. 那么 ...

  9. [C#防止反编译].NET 产品版权保护方案 (.NET源码加密保护)

    [C#防止反编译].NET 产品版权保护方案 (.NET源码加密保护) 标签: .net加密产品c#dll工具 2011-03-24 21:06 27009人阅读 评论(13) 收藏 举报 分类: C ...

  10. 如何应对DDOS网络攻击(之二)

    上期回顾: 如何应对DDOS网络攻击(一) http://chenguang.blog.51cto.com/350944/302531   如何应对DDOS网络攻击(之二) 650) this.wid ...