1365 - 木杆上的蚂蚁

第二届ACM趣味程序设计竞赛 过去也快1个月了 一直没把没过的题搞过去 有点愧对太阳叔叔。所以特此开篇。

 


一开始想复杂了 那么多碰头 该有多复杂啊 就在那模拟来模拟去 伤脑筋 这次比赛也就这题卡的我伤心。。。 
废话不说 讲思路吧。。
题目要求要知道蚂蚁的名字 和掉下去的先后顺序(等死活该)注意到 两边的蚂蚁总是最先掉下去的 其次是内部的。 
一层一层剥下去 这样思路就简单了 只要判定最外边两只哪知先掉下去 
显然需要先排序 
用结构体
struct Ant{
char name[11];
int pos;
}ant[
100];


表示蚂蚁;按pos排序;
代码
#include <iostream>
#include
<cstdio>
#include
<algorithm>


/**
* 1365.ant.
*
* Copyright (C) 2011 luxury2664@gmail.com
*/

using namespace std;

struct Ant{
char name[11];
int pos;
}ant[
100];

struct Event{
int drop_time;
char dir;
}eve[
100];

bool ant_cmp(const Ant &ant1, const Ant &ant2)
{
return ant1.pos < ant2.pos;
}

bool eve_cmp(const Event &eve1, const Event &eve2)
{
return eve1.drop_time < eve2.drop_time;
}


int main()
{
int N, L, T, k = 1, i;
char dir[2];
scanf(
"%d", &T);
while (T--) {
printf(
"Case #%d:\n", k++);
scanf(
"%d%d", &N, &L);
for (i = 0; i < N; i++) {
scanf(
"%s%d%s", ant[i].name, &ant[i].pos, dir);
eve[i].dir
= dir[0];
eve[i].drop_time
= (eve[i].dir == 'L') ? ant[i].pos : L - ant[i].pos;
}
sort(ant, ant
+ N, ant_cmp);// 对蚂蚁按pos排序
sort(eve, eve + N, eve_cmp);//对event按时间顺序排序

int l = 0, r = N - 1;


/**
* 因为最先掉下去的一定是左边或右边的
* 只要判定左边或右边那一个先下去
* 由两只蚂蚁相遇可推出多只蚂蚁间的时间关系 即even。
*/
for (i = 0; i < N; i++) {
if (eve[i].dir == 'L'){
printf(
"%d %s\n", eve[i].drop_time, ant[l].name);
l
++;
}
else {
printf(
"%d %s\n", eve[i].drop_time, ant[r].name);
r
--;
}
}
}
return 0;
}

 

posted @ 2011-01-17 11:19  luxury  阅读(422)  评论(0编辑  收藏  举报