程序设计:POJ的题目Ants

蚂蚁爬竿相遇问题

题目
这里写图片描述
在思考算法之前,我们得仔细想想蚂蚁相遇时的情形,相遇时两只蚂蚁分别掉头,我们可以把蚂蚁想象成完全一模一样的,于是相遇掉头就好像没有掉头而是擦肩而过。于是复杂的相遇问题转化为许多只只蚂蚁各自在竿子上往某一段爬。

在上面的分析下,我们再来看什么时候所有蚂蚁落下竿子所需的时间最短,注意是所有蚂蚁。因为蚂蚁在竿子上起始点的方向并没有确定,所以我们为了保证最短,假设所有蚂蚁往离自己最近的竿子末端爬,所以越往竿子中心靠,蚂蚁落下竿子花的时间就越长,而我们要保证所有的蚂蚁都要掉下去,于是满足的最短时间就是最靠近竿子正中的那只蚂蚁爬行的时间。

同样,为了得到所有蚂蚁掉落花费的最长时间,我们得假设所有蚂蚁向离自己最远的那一端爬,于是离两端越近的蚂蚁,爬到另一端的时间显然就越长,为了保证所有蚂蚁都要掉下竿子,所以我们找出离竿子中心最远,也就是离竿子两端最近的蚂蚁所爬行的时间,就是所有蚂蚁掉下竿子的最长时间。

于是算法如下

// 输入
int L, n;
int x[MAX_N];
void solve() {
// 计算最短时间
int minT = 0;
for (int i = 0; i < n; i++) {
minT = max(minT, min(x[i], L - x[i]));
}
// 计算最长时间
int maxT = 0;
for (int i = 0; i < n; i++) {
maxT = max(maxT, max(x[i], L - x[i]));
}
printf("%d %d\n", minT, maxT);
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值