您的位置:首页 > 大数据 > 物联网

UVA 10881 Piotr's Ants (思维)

2018-02-02 14:22 369 查看
vj链接

题意:一根杆子,上面有n只蚂蚁,每只蚂蚁初始都有它的行动方向,如果碰到另一只蚂蚁,双方就反向继续走。求T时间后,所有蚂蚁的位置及反向,turning表示正在转向的蚂蚁,不在杆子上就fell off

思路:其实从题意的第一句话中,可以得到一个很重要的信息“蚂蚁们的相对位置是不变的”。然后就需要开个脑洞,当蚂蚁碰撞后,我们并不模拟他们调头行走,而是让他们继续朝原来的方向走,这样,从外人看来,依然是一个向左走,一个向右走,且由于蚂蚁们的相对位置是不变的,所以我们只要求出,从左到右这么多蚂蚁,最后的位置和朝向就行了,不需要在计算的时候,区分,谁是谁。

代码:

import java.util.*;
class Ant implements Comparable<Ant>{
int id, p, d;
public Ant(int id, int p, int d) {
this.id = id;
this.p = p;
this.d = d;
}
@Override
public int compareTo(Ant o) {
return p - o.p;
}
}
public class Main{
static Scanner sc = new Scanner(System.in);
static int t,n,L,T;
static Ant [] start;
static Ant [] end;
static int [] order;
static String [] dd = {"L","Turning","R"};
public static void main(String[] args) {
t = sc.nextInt();
for(int k = 1; k <= t; k++) {
L = sc.nextInt(); T = sc.nextInt(); n = sc.nextInt();
start = new Ant
;
end = new Ant
;
order = new int
;
for(int i = 0; i < n; i++) {
start[i] = new Ant(i,sc.nextInt(),sc.next().equals("R")?1:-1);
end[i] = new Ant(-1,start[i].p+start[i].d*T,start[i].d);
}
Arrays.sort(start);
for(int i = 0; i < n; i++) {//计算第几个进来蚂蚁的相对位置
order[start[i].id] = i;
}
Arrays.sort(end);
for(int i = 0; i < n-1; i++) {
if(end[i].p == end[i+1].p) end[i].d = end[i+1].d = 0;
}
System.out.println("Case #"+k+":");
for(int i = 0; i < n; i++) {
int a = order[i];//第i个进来的蚂蚁,它的最终相对位置
if(end[a].p < 0 || end[a].p > L)
System.out.println("Fell off");
else {
System.out.println(end[a].p+" "+dd[end[a].d+1]);
}
}
System.out.println();
}
System.exit(0);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: