1365 - 木杆上的蚂蚁

本文解析了第二届ACM趣味程序设计竞赛中一道难题的解决思路及代码实现。通过分析蚂蚁掉落顺序的问题,采用排序和模拟的方法,成功解决了比赛中的难点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 


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

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


表示蚂蚁;按pos排序;
ContractedBlock.gif ExpandedBlockStart.gif 代码

     
#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 ;
}

 

转载于:https://www.cnblogs.com/luxury/archive/2011/01/17/1936937.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值