博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj_1852_Ants(复杂问题简单化)
阅读量:4653 次
发布时间:2019-06-09

本文共 1269 字,大约阅读时间需要 4 分钟。

描述

一群蚂蚁走在长度为l cm的水平细杆上,以1cm/s的匀速。当一只行走的蚂蚁到达杆的一端,它就会掉下去。当两只蚂蚁相遇,它们会掉头像反方向走去。我们知道一只蚂蚁在杆上的初始位置,然而,我们不知道蚂蚁在像哪一个方向走。你的任务是计算所有蚂蚁从杆上掉下所需的最早和最晚的时间。

 

思路

1.如果每只蚂蚁都向近的那一端走,蚂蚁一定不会相遇,最后一只蚂蚁到达端点所用的时间即为最短时间。

证明:取中点q.根据以上原则,在q左边的蚂蚁会向左爬,在q右边的蚂蚁会像右爬。因此任意两只蚂蚁不会相遇。又由于每只蚂蚁都向较近的的那一端爬,对于每只蚂蚁,爬到端点的时间最短。因此,最后一只到达端点的蚂蚁所用时间即为最短总时间。即t_min=max=(t_min,min(x[i],L-x[i]))

 

2.对于最大时间,

   表面上看,蚂蚁相遇次数越多越好,因为这样蚂蚁就会不断在杆上往返,增加总的时间。那么,有没有一个时间上限呢?

   考虑两只蚂蚁相遇的情况,如果把每只蚂蚁看作完全一样毫无差别的,那么,蚂蚁的相遇也可以看作如下图所示的情况:

    

  因此,最大时间是所有蚂蚁到最远端所用时间中最大的那一个时间,及t_max=max(t_max,max(x[i],L-x[i]))

 

  代码

  

1 #include
2 #include
3 #include
4 5 using namespace std; 6 7 int anti[1000003]; 8 9 int main()10 {11 int cas;12 cin >> cas;13 while (cas--)14 {15 int L, n;16 cin >> L >> n;17 18 for (int i = 0; i < n; i++)19 //cin >> anti[i];20 scanf("%d", &anti[i]);21 22 23 int t_max=0,t_min=0;24 for (int i = 0; i < n; i++)25 {26 t_max = max(t_max,max(anti[i],L - anti[i]) );27 t_min = max(t_min,min(anti[i],L - anti[i]) );28 }29 30 cout << t_min << " " << t_max << endl;31 }32 return 0;33 }

 

转载于:https://www.cnblogs.com/zhenghao2/p/6446065.html

你可能感兴趣的文章
ASP:Checkbox验证非空的一种方法
查看>>
[CQOI2013]新Nim游戏 线性基
查看>>
我的成就故事
查看>>
VB6.0 API 累计
查看>>
第十周学习进度博客
查看>>
Ecshop 最小起订量如何设置
查看>>
不使用其他变量实现两变量互换
查看>>
bcp功能
查看>>
xcode项目打不开:incompatible project version问题
查看>>
学习网站
查看>>
C#4.0新特性dynamic\可选参数、命名参数
查看>>
使用免费SSL证书让网站支持HTTPS访问
查看>>
第5章 使用MUI与H5+构建移动端app
查看>>
poj 2528 Mayor's posters (线段树+染色)
查看>>
eclipse中跳转到其它函数方法后如何快速返回原处
查看>>
第三次作业
查看>>
javascript相关知识
查看>>
数组对象去重
查看>>
你未必知道的12个JavaScript技巧
查看>>
mysql的基本操作命令
查看>>