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);
}
}
题意:一根杆子,上面有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);
}
}
相关文章推荐
- Uva 10881 Piotr's Ants (模拟+思维)
- UVA.10881 Piotr's Ants (思维题)
- uva 10881 - Piotr's Ants (思维,3级)
- [UVA] 10881 - Piotr's Ants - 思维(丑陋的)
- UVA 10881 - Piotr's Ants(思维转换)
- UVA 10881 - Piotr's Ants(思维题)
- UVa --- 10881 Piotr's Ants 【思维】
- UVA 10881 Piotr's Ants(思维题)
- UVA 10881 - Piotr‘s Ants
- uva 10881 Piotr's Ants (模拟)
- UVA - 10881 Piotr's Ants
- UVa10881-Piotr's Ants
- UVa 10881 Piotr's Ants (排序)
- 思维题 UVA 10881 Piotr's Ants
- UVA-10881 - Piotr's Ants
- UVa 10881 Piotr's Ants
- 例题5 UVA 10881 蚂蚁(Piotr's Ants)
- UVa - 10881 Piotr's Ants(技巧题)
- UVA 10881 Piotr's Ants
- UVA-10881 Piotr's Ants (想法题)