画圆的沙滩

亦简亦美

相交的蚂蚁

编程之美4.7节。参考下题:

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

int main() {
vector
<int> positions;
int t, len, n;
cin
>>t;
while (t--) {
cin
>>len>>n;
positions.clear();
while (n--) *back_inserter(positions) = *istream_iterator<int>(cin);

int maxValue = 0, minValue = 0;
for (size_t i = 0; i < positions.size(); ++i) {
int cmax = positions[i], cmin = len - positions[i];
if (cmax < cmin) swap(cmax, cmin);
maxValue
= max(cmax, maxValue);
minValue
= max(cmin, minValue);
}
cout
<<minValue<<' '<<maxValue<<'\n';
}
return 0;
}

转到扩展问题:

先看问题4和5:这两个问题实际是解答前面扩展问题的预热。

4. 如果找到鸽子飞行的时间就可以获得最后的里程。它飞行的时间恰好是两人相遇所花的时间s/(a+b)。所以总里程是s*c/(a+b)。

5. 如果以水流为参考惯性系,船的速度是-a和a,而救生圈的速度为0。这样,很容易得出返回去找到时间和离开的时间相同,也是一个小时。

回到问题1:参照问题4, 先考虑一个较简单的情形: 1-> 2-> <-3。这里2先与3碰头,然后,再与1碰头。我们考虑它与1碰头的位置。实际上,2与3碰头之后,等效于3继续前行,所以,2与1碰头的位置即2,3之间的中点。考虑更普遍的情形:1-> 2, 3, ... i -> , i+1, ..., <- n。如果把中间所有的蚂蚁都以交换法则看作代理,这个情形实际上同前面较简单的情形是一致的。所以,对于第i只蚂蚁来说,它爬出界的时间,决定于左边第一个和它同向的蚂蚁和右边最后一个和它异向的蚂蚁之间的中点位置。

再考虑问题3:根据交换原则,蚂蚁i碰头的次数,决定于左右爬向它的蚂蚁数较小的那一个。

最后,问题2:我们将蚂蚁的爬行速度和位置分别投影到x,y轴上,可以获得两个相似的问题,但是蚂蚁的速度各不相同。遗憾的是,关于速度个不相同的算法,我暂时只有暴力式的。

posted on 2011-03-21 12:11  acmaru  阅读(199)  评论(0编辑  收藏  举报

导航