UVA 10881 - Piotr's Ants【模拟+思维】
时间:2022-05-07
本文章向大家介绍UVA 10881 - Piotr's Ants【模拟+思维】,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目链接: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 offn");
49 else printf("%d %sn",after[a].p, dirName[after[a].d+1]);
50 }
51 printf("n");
52 }
53 return 0;
54 }
- GoStub框架二次开发实践
- 厚土Go学习笔记 | 31. 错误 通常函数会返回一个error值来判断是否出错
- 厚土Go学习笔记 | 30. Stringers的一个练习
- 黑客游戏| Owasp juice shop (一)
- 厚土Go学习笔记 | 29. 接口
- Golang中Interface类型详解
- 反序列化| 我欲修仙,法力无边。
- Go语言的网络编程简介
- golang基于redis lua封装的优先级去重队列
- 厚土Go学习笔记 | 28. go语言没有类 却可以在结构体或任意类型定义方法
- 41. select阻塞一个gorountine上的多个通讯操作 | 厚土Go学习笔记
- 40. range和channel的close | 厚土Go学习笔记
- 48. 访问MySql数据库增删改查和连接池及空字段处理 | 厚土Go学习笔记
- Go语言·我的性能我做主
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法