Piotr's Ants UVA - 10881
2017-09-27 22:48
429 查看
当蚂蚁A与蚂蚁B碰头时,A与B都要切换方向,考虑个体难以实现,用整体考虑,A与B相遇之后,可以认为A,B直接穿过对方,order数组用来存储输入顺序在排序后的数组的下标
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN = 10000 + 5;
struct Ant {
int id; //输入顺序,输出时按照此顺序
int p; //位置
int d; //朝向,-1 :L, 0 :T,1 :R
bool operator < (const Ant &a) const {//按距左端点的距离排序
return p < a.p;
}
} before[MAXN], after[MAXN];//初始数组,终态数组
const char dirName[][10] = {"L", "Turning", "R"};//答案状态
int order[MAXN]; //输入的第i只蚂蚁是状态中的左数第order[i]只蚂蚁
int main() {
int K;
scanf("%d", &K);
for(int kase = 1; kase <= K; ++kase) {
int L, T, n;
printf("Case #%d:\n", kase);
scanf("%d%d%d", &L, &T, &n);
for(int i = 0; i < n; ++i) { //Input
int p, d;
char c;
scanf("%d %c", &p, &c);
d = (c == 'L' ? -1 : 1);
before[i] = (Ant) {
i, p, d
};
after[i] = (Ant) {
0, p + T * d, d //T时间后必定有某个蚂蚁状态为此
}; //id是未知的
}
//计算order数组
sort(before, before + n);
for(int i = 0; i < n; ++i) {
order[before[i].id] = i; //id是几就第几个输出,id映射到数组位置
}
//计算终态
sort(after, after + n); //按照距离左端点顺序排序,蚂蚁运动后,不会影响其相对位置,order的可行原因
for(int i = 0; i < n - 1; ++i) {
if(after[i].p == after[i + 1].p) { //修改碰撞中的蚂蚁的方向
after[i].d = after[i + 1] .d = 0;
}
}
//输出结果
for(int i = 0; i < n; ++i) {
int a = order[i];
if(after[a].p < 0 || after[a].p > L) { //已经跌落
printf("Fell off\n");
} else {
printf("%d %s\n", after[a].p, dirName[after[a].d + 1]);
}
}
printf("\n");
}
return 0;
}
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN = 10000 + 5;
struct Ant {
int id; //输入顺序,输出时按照此顺序
int p; //位置
int d; //朝向,-1 :L, 0 :T,1 :R
bool operator < (const Ant &a) const {//按距左端点的距离排序
return p < a.p;
}
} before[MAXN], after[MAXN];//初始数组,终态数组
const char dirName[][10] = {"L", "Turning", "R"};//答案状态
int order[MAXN]; //输入的第i只蚂蚁是状态中的左数第order[i]只蚂蚁
int main() {
int K;
scanf("%d", &K);
for(int kase = 1; kase <= K; ++kase) {
int L, T, n;
printf("Case #%d:\n", kase);
scanf("%d%d%d", &L, &T, &n);
for(int i = 0; i < n; ++i) { //Input
int p, d;
char c;
scanf("%d %c", &p, &c);
d = (c == 'L' ? -1 : 1);
before[i] = (Ant) {
i, p, d
};
after[i] = (Ant) {
0, p + T * d, d //T时间后必定有某个蚂蚁状态为此
}; //id是未知的
}
//计算order数组
sort(before, before + n);
for(int i = 0; i < n; ++i) {
order[before[i].id] = i; //id是几就第几个输出,id映射到数组位置
}
//计算终态
sort(after, after + n); //按照距离左端点顺序排序,蚂蚁运动后,不会影响其相对位置,order的可行原因
for(int i = 0; i < n - 1; ++i) {
if(after[i].p == after[i + 1].p) { //修改碰撞中的蚂蚁的方向
after[i].d = after[i + 1] .d = 0;
}
}
//输出结果
for(int i = 0; i < n; ++i) {
int a = order[i];
if(after[a].p < 0 || after[a].p > L) { //已经跌落
printf("Fell off\n");
} else {
printf("%d %s\n", after[a].p, dirName[after[a].d + 1]);
}
}
printf("\n");
}
return 0;
}
相关文章推荐
- UVA10881----Piotr's Ants
- uva - 10881 - Piotr's Ants(等效变换,排序)
- UVa 10881 Piotr's Ants 蚂蚁
- Piotr's ants UVA 10881
- 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 推理
- 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