1456. [UVa 10881,Piotr's Ants]蚂蚁

★   输入文件:Ants.in   输出文件:Ants.out   简单对比
时间限制:1 s   内存限制:128 MB

【题目描述】

一根长度为L厘米的木棍上有n只蚂蚁,每只蚂蚁要么往左爬要么往右爬,速度为1cm/s。当两只蚂蚁相遇时,二者同时掉头(掉头时间忽略不计)。给出每只蚂蚁的初始位置和朝向,计算T秒之后蚂蚁的位置。

【输入格式】

输入第一行为数据组数。每组第一行为三个整数L,T,n(n≤10 000);以下n行描述一只蚂蚁的初始位置,其中,整数x为蚂蚁距左端的距离(单位:厘米),字母表示初始朝向(L向左,R向右)。

【输出格式】

对于每组数据,输出n(Case #n:),按输入顺序输出每只蚂蚁的位置和朝向(Turning表示正在碰撞)。在T秒之前已经掉落的蚂蚁(正好爬到边缘不算)输出Fell off

【样例输入】

2
10 1 4
1 R
5 R
3 L
10 R
10 2 3
4 R
5 L
8 R

【样例输出】

Case #1:
2 Turning
6 R
2 Turning
Fell off
Case #2:
3 L
6 R
10 R

【来源】

UVa 10881,Piotr's Ants

思路:

  假设你在远处观察这些蚂蚁的运动,会看到什么?一群密密麻麻的小黑点在移动。由于黑点太小,所以当蚂蚁一碰撞而掉头时,看上去和两个点”对穿而过“没有什么区别。换句话说,如果把蚂蚁看做是没有区别的小点,那么只需要计算出每只蚂蚁在T时刻的位置即可。比如,有3只蚂蚁,蚂蚁1=(1,R),蚂蚁2=(3,L),蚂蚁3=(4,L),则两秒之后,三只蚂蚁分别为(3,R),(1,L)和(2,L)。

  注意,虽然从整体上讲,”掉头“等价于”对穿而过“,但对于每只蚂蚁而言,并不是这样。蚂蚁1的初始状态为(1,R),因此一定有一只蚂蚁在两秒钟之后处于(3,R)的状态,但这只蚂蚁却不一定是蚂蚁1.换句话说,我们需要搞清楚目标状态中的”谁是谁“。

  可以想象一下,所有蚂蚁的相对顺序是保持不变的。然后这个问题就很好解决了。

这是代码:

#include<map>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 10001
using namespace std;
map<int,int>vis;
int T;
int len,t,n,num;
struct nond{
int pos,turn,id;
}v[MAXN],vv[MAXN];
int cmp(nond a,nond b){
return a.pos<b.pos;
}
int cmp1(nond a,nond b){
return a.id<b.id;
}
int main(){
freopen("Ants.in","r",stdin);
freopen("Ants.out","w",stdout);
scanf("%d",&T);
for(int k=;k<=T;k++){
vis.clear();
memset(v,,sizeof(v));
memset(vv,,sizeof(vv));
printf("Case #%d:",k);
scanf("%d%d%d",&len,&t,&n);
for(int i=;i<=n;i++){
char c;
scanf("%d %c",&v[i].pos,&c);
if(c=='R') v[i].turn=;
else v[i].turn=-;
v[i].id=i;vv[i]=v[i];
}
sort(v+,v++n,cmp);
sort(vv+,vv++n,cmp);
for(int i=;i<=n;i++){
if(vv[i].turn==-) vv[i].pos-=t;
else if(vv[i].turn==) vv[i].pos+=t;
if(vv[i].pos>len||vv[i].pos<) vv[i].turn=;
else vis[vv[i].pos]++;
}
sort(vv+,vv++n,cmp);
for(int i=;i<=n;i++){
v[i].pos=vv[i].pos;
v[i].turn=vv[i].turn;
}
sort(v+,v++n,cmp1);
for(int i=;i<=n;i++){
if(v[i].turn==) cout<<"Fell off"<<endl;
else if(vis[v[i].pos]!=) cout<<v[i].pos<<" "<<"Turning"<<endl;
else if(v[i].turn==) cout<<v[i].pos<<" "<<"R"<<endl;
else cout<<v[i].pos<<" "<<"L"<<endl;
}
}
}

cogs 1456. [UVa 10881,Piotr's Ants]蚂蚁的更多相关文章

  1. [ACM_模拟] UVA 10881 Piotr's Ants[蚂蚁移动 数组映射 排序技巧]

    "One thing is for certain: there is no stopping them;the ants will soon be here. And I, for one ...

  2. Uva 10881 Piotr’s Ants 蚂蚁

    一根长度为 L 厘米的木棍上有 n 只蚂蚁,每只蚂蚁要么朝左爬,要么朝右爬,速度为 1 厘米/秒.当两只蚂蚁相撞时,二者同时调头(掉头用的时间忽略不计).给出每只蚂蚁的初始位置和朝向,计算 T 秒之后 ...

  3. POJ 1852 Ants || UVA 10881 - Piotr's Ants 经典的蚂蚁问题

    两题很有趣挺经典的蚂蚁问题. 1.n只蚂蚁以1cm/s的速度在长为L的竿上爬行,当蚂蚁爬到竿子的端点就会掉落.当两只蚂蚁相撞时,只能各自反向爬回去.对于每只蚂蚁,给出距离左端的距离xi,但不知道它的朝 ...

  4. UVA.10881 Piotr's Ants (思维题)

    UVA.10881 Piotr's Ants (思维题) 题意分析 有一根长度为L cm的木棍,上有n只蚂蚁,蚂蚁要么向左爬,要么向右,速度均为1cm/s,若2只蚂蚁相撞,则蚂蚁同时调头.求解第T秒时 ...

  5. 思维题 UVA 10881 Piotr's Ants

    题目传送门 /* 题意:在坐标轴上一群蚂蚁向左或向右爬,问经过ts后,蚂蚁的位置和状态 思维题:本题的关键1:蚂蚁相撞看作是对穿过去,那么只要判断谁是谁就可以了 关键2:蚂蚁的相对位置不变 关键3:o ...

  6. UVA 10881 Piotr's Ants(等效变换 sort结构体排序)

    Piotr's AntsTime Limit: 2 seconds Piotr likes playing with ants. He has n of them on a horizontal po ...

  7. UVA 10881 - Piotr's Ants【模拟+思维】

    题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  8. uva 10881 Piotr's Ants 解题报告

    题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=20&pa ...

  9. uva 10881 - Piotr's Ants

    这个题的突破点就在于蚂蚁不能够穿过对方,故相对位置不变: 另外,又可以把蚂蚁看成运动方向不变: 代码: #include<cstdio> #include<algorithm> ...

随机推荐

  1. Linux 命令行光标快速选中移动快捷键

    Ctrl+Alt+T 打开终端一些常用的终端快捷键:Ctrl+L 清空屏幕(功能相当于命令clear)Ctrl+U 剪切文本直到行的起始(可以用于清空行)Ctrl+K 剪切文本直到行的末尾Ctrl+Y ...

  2. 启动hadoop遇到的datanode启动不了

    从截图上看是datanode的clusterID 和 namenode的clusterID 不匹配. 解决办法: 根据日志中的路径,cd /hadoop/data/dfs/ 能看到 data和name ...

  3. JQ加载进度条动画

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. ORM原理

    原理: 1.实现JavaBean的属性到数据库表的字段的映射:        --通过配置文件将JavaBean的属性与数据库表的字段的关联起来 2.映射关系:   一对多,多对一等 持久层(Pers ...

  5. pycaffe 可视化常用

    net.params['layername'].[0]/[1] caffe的一个程序跑完之后会在snapshot所指定的目录下产生一个后缀名为caffemode的文件,这里存放的就是我们在训练网络的时 ...

  6. 2019 前端面试题汇总(主要为 Vue)

    原文链接:点我 由于我的技术栈主要为Vue,所以大部分题目都是Vue开发相关的. 1. 谈谈你对MVVM开发模式的理解 MVVM分为Model.View.ViewModel三者. Model:代表数据 ...

  7. js001 ---- async

    Node.js异步流,详细见https://caolan.github.io/async/docs.html#parallel 1, async 用的比较多的是 waterfall, 瀑布流, 就是每 ...

  8. CF732F Tourist Reform(边双联通)

    题意 在一张有向图中,设 ri 为从点 i 出发能够到达的点的数量. 定义有向图的“改良值”为 ri 的最小值. 现给出一张无向图,要求给每条边定一个方向,使产生的有向图“改良值”最大. 输出 最大改 ...

  9. 雅礼集训1-9day爆零记

    雅礼集训1-9day爆零记 先膜一下虐爆我的JEFF巨佬 Day0 我也不知道我要去干嘛,就不想搞文化科 (文化太辣鸡了.jpg) 听李总说可以去看(羡慕)各路大佬谈笑风声,我就报一个名吧,没想到还真 ...

  10. 函数指针的转换 & C的注意点

    再让我们看看<signal.h>中声明的signal函数void (*signal(int, void(*)(int)))(int)首先,用typedef简化,typedef void ( ...