蚂蚁的军队在长度lcm的水平杆上行走,每个具有1cm / s的恒定速度。当一个行走的蚂蚁到达杆的一端,它立即掉落。当两只蚂蚁相遇时,他们返回,开始朝着相反的方向走。我们知道蚂蚁在杆子上的原始位置,不幸的是,我们不知道蚂蚁行走的方向。你的任务是计算所有蚂蚁脱离杆子所需的最短和最长的可能时间。
分析:由于每只蚂蚁的速度相等,所以蚂蚁之间是完全一样的,两只蚂蚁相遇后再反向,可以看做相遇后继续往前走,那么所有蚂蚁脱离杆子最短的时间,就是每只蚂蚁沿离杆近的一段走的最长时间,所有蚂蚁脱离杆子的最长时间,就是每只蚂蚁沿离杆远的一段走的最长时间。
minn = max(min(v[i] - 0,l + 1 - v[i]),minn); maxx = max(max(v[i] - 0,l + 1 - v[i]),maxx);
eg 2: Luogu P1367 蚂蚁
有许多蚂蚁在一根无限长的木棍上,每一只蚂蚁都有一个初始位置和初始朝向(任意两只蚂蚁的初始位置不同)。蚂蚁们以每秒一个单位的速度向前移动,当两只蚂蚁相遇时,它们会掉头(掉头时间忽略不计)。现给出每只蚂蚁的初始位置和初始朝向,请你计算出它们在t秒后的位置和朝向。
分析:在此题中我们就不能把每只蚂蚁看做一样的了,但我们发现,运动前后每只蚂蚁的相对位置顺序是不变的,就可以以此求解了。
for(int i=1;i<=n;i++){ cin>>k[i].a>>k[i].b; r[i] = k[i]; r[i].order = i; k[i].a += t*k[i].b; r[i].bump = k[i].bump = 0; } sort(k+1,k+1+n,cmp); //按最后的位置排序 sort(r+1,r+1+n,cmp); //按初始位置排序 for(int i=1;i<=n;i++){ k[i].order = r[i].order; //得到初始位置的顺序 } for(int i=1;i<=n;i++){ if(k[i].a == k[i+1].a) k[i].bump = 1,k[i+1].bump = 1; } sort(k+1,k+1+n,cmpp); for(int i=1;i<=n;i++){ if(k[i].bump) printf("%d 0\n",k[i].a); else printf("%d %d\n",k[i].a,k[i].b); }