您的位置:首页 > 其它

CDOJ 木杆上的蚂蚁

2015-08-17 15:38 836 查看
http://www.acm.uestc.edu.cn/#/problem/show/300

Description

在一根细木杆上,有一些速度相同蚂蚁,它们有的往左走,有的往右走,木杆很细,只允许一只蚂蚁通过,所以当两只蚂蚁碰头的时候,它们会掉头继续前进,直到走出边界,掉下木杆。

已知木杆的长度和每只蚂蚁的名字、位置和初始方向,问依次掉下木杆的蚂蚁花费的时间以及它的名字。

Input

输入包含多组测试数据。

第一行包含一个整数T(T <= 20),代表测试数据组数。

每组测试数据的第一行包含两个整数N L,表示有N只蚂蚁(N <= 100),木杆长度为L(L <= 1000)。假设蚂蚁每秒前进一个单位距离,掉头转向的时间忽略不计。

以下N行,每行依次为蚂蚁的名字(长度不超过10,仅由英文字母组成),初始位置p(0 < p < L,整数,表示蚂蚁离木杆最左端的距离),初始方向(一个字符,L表示向左,R表示向右),以单个空格分隔,数据保证初始不会有两只蚂蚁在同一个位置。

Output

对于第k组测试数据,首先输出一行为“Case #k:”。

然后输出N行,给出依次掉下木杆的蚂蚁花费的时间以及它的名字,以单个空格分隔。

(按照掉下木杆的先后顺序输出,数据保证不会有两支蚂蚁同时掉下木杆)。

Sample Input

2

2 5

GG 1 L

2 5

GG 1 R

MM 2 L

Sample Output

Case #1:

1 GG

2 MM

2 GG

4 MM

分析:按照蚂蚁的初始位置,以及它的方向排序,可以认为蚂蚁相遇时就代替对方继续走下去。

#include <cstdio>
#include <algorithm> //因为要用sort算法
#define N 100
using namespace std; //必须引用名字空间std
struct ant_type
{
int pos;
char name[11];
} ants
;
struct event_type
{
int drop_time;
char dir;
} events
;
bool cmp_ant(const ant_type& p, const ant_type& q)
{
return p.pos < q.pos;
}
bool cmp_event(const event_type& p, const event_type& q)
{    return p.drop_time < q.drop_time;
}
int main()
{
char dir[2];
int i, k, n, L, R, T;
scanf("%d", &T);
for (k = 1; k <= T; k++)
{
scanf("%d%d", &n, &L);
for (i = 0; i < n; i++)
{
scanf("%s%d%s", ants[i].name, &ants[i].pos, dir);
events[i].dir = dir[0];
events[i].drop_time = (dir[0] == 'L' ?
ants[i].pos : L - ants[i].pos);
}
sort(ants, ants + n, cmp_ant);
sort(events, events + n, cmp_event);
printf("Case #%d:\n", k);
L = 0;        R = n - 1;
for (i = 0; i < n; i++)
{
if (events[i].dir == 'L')
{
printf("%d %s\n", events[i].drop_time, ants[L].name);
L++;
}
else
{
printf("%d %s\n", events[i].drop_time, ants[R].name);
R--;
}}}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: