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

简介: 题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1822 题意:有很多只蚂蚁在一条直线上,每个蚂蚁移动速度都是1,并且有一个初始方向。

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

题意:有很多只蚂蚁在一条直线上,每个蚂蚁移动速度都是1,并且有一个初始方向。并且当相邻两个蚂蚁相撞时转向。现在问t时间后各个蚂蚁的位置。

解法:这题的一个致命技巧就是把两只蚂蚁的相撞看作是两只蚂蚁交换穿过对方并且交换蚂蚁的编号。这个是很好理解的,类似于物理的完全弹性碰撞。又由于任何两只蚂蚁的相对位置在这种转弯的情况下不会改变相对位置,因此我们只要视作所有蚂蚁没有蚂蚁的行动。最后根据位置关系对应到原始的位置关系。最后再做位置判断的时候查看是否超出坐标之外即可。

下面给出AC代码:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=10000+5;
 4 struct Ant
 5 {
 6     int id;//顺序
 7     int p;//位置
 8     int d;//转向,-1表示左,0表示碰撞中,1表示右
 9     bool operator <(const Ant& a)const
10     {
11         return p<a.p;
12     }
13 }before[maxn],after[maxn];
14 const char dirName[][10]={"L","Turning","R"};
15 int order[maxn];//输入的第i只蚂蚁是终态中的左数第order[i]只蚂蚁
16 int main()
17 {
18     int K;
19     scanf("%d",&K);
20     for(int kase=1;kase<=K;kase++)
21     {
22         int L,T,n;
23         scanf("%d%d%d",&L,&T,&n);
24         for(int i=0;i<n;i++)
25         {
26             int p,d;
27             char c;
28             scanf("%d %c",&p,&c);
29             d=(c=='L'?-1:1);
30             before[i]=(Ant){i,p,d};
31             after[i]=(Ant){0,p+T*d,d};//所有的蚂蚁相撞后可以看做对穿而过,这里的id是未知的
32         }
33         printf("Case #%d:\n",kase);
34         //计算order数组
35         sort(before,before+n);
36         for(int i=0;i<n;i++)//最巧妙的地方在这里,第一次从左到右所有的蚂蚁的相对位置没有变化
37             order[before[i].id]=i;
38         //计算终态
39         sort(after,after+n);
40         for(int i=0;i<n-1;i++)//修改碰撞中的蚂蚁的方向
41             if(after[i].p==after[i+1].p)
42                 after[i].d=after[i+1].d=0;
43         //输出结果
44         for(int i=0;i<n;i++)
45         {
46             int a=order[i];
47             if(after[a].p<0||after[a].p>L)
48                 printf("Fell off\n");
49             else printf("%d %s\n",after[a].p, dirName[after[a].d+1]);
50         }
51         printf("\n");
52     }
53     return 0;
54 }

 

目录
相关文章
|
21天前
|
机器学习/深度学习 算法
强化学习之父Richard Sutton给出一个简单思路,大幅增强所有RL算法
Richard Sutton领导的团队提出了一种称为“奖励中心化”的方法,通过从观察到的奖励中减去其经验平均值,使奖励更加集中,显著提高了强化学习算法的性能。该方法在解决持续性问题时表现出色,尤其是在折扣因子接近1的情况下。论文地址:https://arxiv.org/pdf/2405.09999
58 15
|
7月前
|
程序员
程序员必知:【UVA10533】DigitPrimes
程序员必知:【UVA10533】DigitPrimes
26 0
|
7月前
|
人工智能 Java 程序员
程序员必知:uva10808
程序员必知:uva10808
34 0
|
8月前
|
固态存储 算法 计算机视觉
CV目标检测 Task04:不讲武德-炼丹与品尝 终于,神功初成,可以开始施展拳脚了 打卡笔记
CV目标检测 Task04:不讲武德-炼丹与品尝 终于,神功初成,可以开始施展拳脚了 打卡笔记
97 0
Shortest Path with Obstacle( CodeForces - 1547A )(模拟)
Shortest Path with Obstacle( CodeForces - 1547A )(模拟)
58 0
HJ76--尼科彻斯定理
HJ76--尼科彻斯定理
122 0
|
机器学习/深度学习 Web App开发 人工智能
7 Papers & Radios | 脑机接口让渐冻重症患者重获交流;295页博士论文探索强化学习抽象理论(1)
7 Papers & Radios | 脑机接口让渐冻重症患者重获交流;295页博士论文探索强化学习抽象理论
|
机器学习/深度学习 存储 人工智能
7 Papers & Radios | 脑机接口让渐冻重症患者重获交流;295页博士论文探索强化学习抽象理论(2)
7 Papers & Radios | 脑机接口让渐冻重症患者重获交流;295页博士论文探索强化学习抽象理论
CF979B Treasure Hunt(贪心 思维)
CF979B Treasure Hunt(贪心 思维)
98 0
CF979B Treasure Hunt(贪心 思维)
|
人工智能 BI
[UVA 1599] Ideal Path | 细节最短路
Description New labyrinth attraction is open in New Lostland amusement park. The labyrinth consists of n rooms connected by m passages. Each passage is colored into some color ci .
209 0