蚂蚁杆子问题
来源:互联网 发布:淘宝确认自动收货时间 编辑:程序博客网 时间:2024/04/29 15:06
问题:
n 只蚂蚁以每秒1cm 的速度在长为Lcm 的竿子上爬行。当蚂蚁爬到竿子的端点时就会掉落。
由于竿子太细,两只蚂蚁相遇时,它们不能交错通过,只能各自反向爬回去。对于每只蚂蚁,
我们知道它距离竿子左端的距离xi,但不知道它当前的朝向。请计算所有蚂蚁落下竿子所需的最短时间和最长时间。
分析:
1、首先对于最短时间,看起来所有蚂蚁都朝向较近的端点走会比较好。事实上,这种情况下不会发生两只蚂蚁相遇的情况,而且也不可能在比此更短的时间内走到竿子的端点。
2、接下来,为了思考最长时间的情况,让我们看看蚂蚁相遇时会发生什么。
事实上,可以知道两只蚂蚁相遇后,当它们保持原样交错而过继续前进也不会有任何问题。这样看来,可以认为每只
蚂蚁都是独立运动的,所以要求最长时间,只要求蚂蚁到竿子端点的最大距离就好了。
这样,不论最长时间还是最短时间,都只要对每只蚂蚁检查一次就好了,这是O(n)时间的算法。
对于限制条件n ≤ 10的六次方,这个算法是够用的,于是问题得解。
#include <stdio.h>
#define MAX_N 100
//定义两个函数,取最大值、最小值
static int max(int x,int y);
static int min(int x,int y);
int main(int argc, char** argv)
{
int n;
int L;
int x[MAX_N];
scanf("%d", &n);//蚂蚁个数
scanf("%d", &L);//杆子长度
int i = 0;
for(i=0;i<n;i++)
{
scanf("%d", &x[i]);//每个蚂蚁距离杆子左端的距离
}
printf("n=%d,L=%d\n",n,L);
for(i=0;i<n;i++)
{
printf("x[%d]=%d,", i,x[i]);
}
printf("\n");
/*先找出每个蚂蚁的最小时间,将这些时间比较,找出最大的时间。即为蚂蚁落下的最短时间*/
int Time = 0;
for(i=0;i<n;i++)
{
Time = max(Time, min(x[i], L-x[i]));
}
printf("the shortest tiem is:%d\n", Time);
printf("----------------------------------------\n");
/*先找出每个蚂蚁的最大时间,将这些时间比较,找出最大的时间。即为蚂蚁落下的最长时间*/
Time = 0;
for(i=0;i<n;i++)
{
Time = max(Time, max(x[i], L-x[i]));
}
printf("the longest tiem is:%d\n", Time);
return 0;
}
static int max(int x,int y)
{
return x>y?x:y;
}
static int min(int x,int y)
{
return x>y?y:x;
}
参考 文章 :【迷你书】挑战程序设计竞赛
- 蚂蚁杆子问题
- 蚂蚁问题
- 蚂蚁问题
- 蚂蚁爬杆问题
- 蚂蚁问题(算法)
- 蚂蚁爬杆问题
- 蚂蚁爬杆问题
- 蚂蚁爬木杆问题
- 蚂蚁爬行问题
- ACM 蚂蚁问题
- 蚂蚁爬杆问题
- 蓝桥杯蚂蚁感冒问题
- 蚂蚁爬杆问题
- 蚂蚁爬杆问题
- 蚂蚁过杆问题
- 蚂蚁爬杆问题
- 3.蚂蚁问题
- 蚂蚁爬杆问题
- 模块构造的编译和装载
- C/C++常用头文件及函数汇总
- QT4.8.3+qtcreator-2.5.2+MinGW环境 出现的一些错误
- UVA - 12491 Words
- Ubuntu Server 12.04“初始化月份字符串出错”的解决方法
- 蚂蚁杆子问题
- 修改计算机名后导致oracle的oem(企业管理器)无法使用
- andriod 生成xml文件 方法
- NSLookup用法
- 关于STM32定时器1的使用
- Codeforces —— 359A Table
- SPI协议概括
- 大数相乘解决办法,用字符串表示的大数
- 解決 Android 平板無法直接寫入外部 SDCard 問題