[Luogu P1367] 蚂蚁

eg 1: POJ Ants   P1007 独木桥

蚂蚁的军队在长度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
",k[i].a);
    else printf("%d %d
",k[i].a,k[i].b);
}
 
原文地址:https://www.cnblogs.com/Cindy-Chan/p/11252359.html