UVA - 10881(思维题)------蚂蚁走竹竿
题意:在这个题中。给了你竹竿的长度L,给了你蚂蚁的个数n,然后下边n行是每一只蚂蚁的初始位置。问你在T秒之后每一只蚂蚁的位置。
这个题给的时间是3000ms,如果一直要写模拟的话,有点烦人。其实,做这道题的时候,我们可以参考挑战书上的一道Ants题。当两只蚂蚁碰撞之后,我们可以将它看为互穿而过,只不过是要改变位置标记。其实,在这道题中,我们可以发现,蚂蚁在同时间是同时进行运动的。那么,它们的相对位置是不会发生改变的。那么,我们就可以对它进行排序。然后记录它的位置。
接下来举几个列子 让大家深刻了解一下
10 2 4
1 R
5 R
3 L
10 R|__*__|__*__|__*__|__|__|__|__* //将已有位置进行了星号标记
0 1 2 3 4 5 6 7 8 9 10-> <- -> ->我们可以有上图得到 在2秒之后的具体分布情况|__*__|__*__|__|__|__*__|__|__| ....第4只蚂蚁掉下 //将到达位置进行了星号标记
0 1 2 3 4 5 6 7 8 9 10<- -> -> 我们可以看到,在1 3 走了一秒之后,它们发生了碰撞。使得1和3掉头继续行走。其实,我们可以换一种思路。当1和3发生碰撞时,我们可以将其视为互穿而过。此时,我们只需交换1和3的位置标记在上边这个例子中(没有开始走之前),我们按照位置排序之后它的id编号变为 0 2 1 3那么,我们就可以用一个order数组来记录变换之后的蚂蚁的位置。进而通过变换后的数组来输出每个蚂蚁的位置。
可能字面意思说的不太清楚。大家可以看下边的代码。进行理解。(主要理解它的相对位置不会发生改变。然后用一个order来记录位置)。
代码:
#include<set>
#include<map>
#include<stack>
#include<bitset>
#include<math.h>
#include<string>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define pi acos(-1)
#define close ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
using namespace std;
typedef long long ll;
const int MAX_N=1000000+50;
const int INF=0x3f3f3f3f;
const double EPS = 1e-10;
ll mod = 1e9+7;struct ant{int id;int pow;int dir;bool operator < (const ant &a)const{return pow<a.pow;}//结构体内部定义排序
}before[MAX_N],after[MAX_N];int order[MAX_N]; //之前的位置记录
char Rlt[][10] = {"L","Turning","R","Fell off"};
int main(){int t;scanf("%d",&t);int L,T,n,k = 1;while(t--){printf("Case #%d:\n",k++);scanf("%d%d%d",&L,&T,&n);int pow;char c;for(int i = 0; i < n ; i++){scanf("%d %c",&pow,&c);int dir = (c == 'L'?-1:1);before[i] = (ant){i,pow,dir}; after[i] = (ant){0,pow + T * dir,dir};}sort(before,before+n);sort(after,after+n);for(int i = 0; i < n; i++){order[before[i].id] = i;}for(int i = 0; i < n - 1; i++){if(after[i].pow == after[i+1].pow) after[i].dir = after[i+1].dir = 0;}for(int i = 0; i < n; i++){int a = order[i];if(after[a].pow < 0 || after[a].pow > L) printf("%s\n",Rlt[3]);else printf("%d %s\n",after[a].pow,Rlt[after[a].dir + 1]);}printf("\n");}return 0;
}/*********************####....#.#..###.....##....###.......###### ### ###........... #...# #...###*####### #.#.# #.#.#####*******###### #.#.# #.#.#...#***.****.*###.... #...# #...#....**********##..... ### ###....**** *****....#### ########## ######
##############################################################
#...#......#.##...#......#.##...#......#.##------------------#
###########################################------------------#
#..#....#....##..#....#....##..#....#....#####################
########################################## #----------#
#.....#......##.....#......##.....#......# #----------#
########################################## #----------#
#.#..#....#..##.#..#....#..##.#..#....#..# #----------#
########################################## ############
*/
UVA - 10881(思维题)------蚂蚁走竹竿相关推荐
- 小思维题-蚂蚁感冒——蓝桥杯
[蚂蚁感冒](https://www.acwing.com/problem/content/description/1213/) Description 长100厘米的细长直杆子上有n只蚂蚁.它们的头 ...
- 思维题 UVA 10881 Piotr's Ants
题目传送门 1 /* 2 题意:在坐标轴上一群蚂蚁向左或向右爬,问经过ts后,蚂蚁的位置和状态 3 思维题:本题的关键1:蚂蚁相撞看作是对穿过去,那么只要判断谁是谁就可以了 4 关键2:蚂蚁的相对位置 ...
- cogs 1456. [UVa 10881,Piotr's Ants]蚂蚁
1456. [UVa 10881,Piotr's Ants]蚂蚁 ★ 输入文件:Ants.in 输出文件:Ants.out 简单对比 时间限制:1 s 内存限制:128 MB [题目描 ...
- 贪心/思维题 UVA 11292 The Dragon of Loowater
题目传送门 1 /* 2 题意:n个头,m个士兵,问能否砍掉n个头 3 贪心/思维题:两个数组升序排序,用最弱的士兵砍掉当前的头 4 */ 5 #include <cstdio> 6 #i ...
- yoyo思维题(困难) 组合数学
问题 B: yoyo思维题(困难) 时间限制: 1 Sec 内存限制: 256 MB 提交: 11 解决: 3 [提交][状态][讨论版][命题人:qianyouyou][Edit] [TestD ...
- codeforces 有意思的思维题 1 ~ 15
codeforces 思维题 1.给定数组,求满足i < j and ai * aj = i + j的数对数量 2.第 i 步向前跳 i 步或后退 1 步 3.给两个点,求正方形的另两个点 4. ...
- I.Gree的心房(思维题)
一开始我读到这道题以为要用dfs结果,读完之后发现好像就是一个思维题: 分析: 首先应该知道因为题目说了,一个人只能走四个方向(up,down,left,right):所以从左上角到右下角,那么就是都 ...
- little w and Soda(思维题)
链接:https://ac.nowcoder.com/acm/contest/297/A 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...
- ZOJ 3829 贪心 思维题
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3829 现场做这道题的时候,感觉是思维题.自己智商不够.不敢搞,想着队友智商 ...
最新文章
- 二十六、二叉树--查找指定节点
- SAP WM 自动创建TO单的JOB运行报错 - Enter the storage unit type - 对策
- 漫话:如何给女朋友解释为什么双11无法修改收货地址?
- 20080826 - Delphi 2009 来了
- Bapi-BAPI_GOODSMVT_CREATE【该物料不可能有库存记帐】
- python上的数据库sqlite3——插入多行数据
- 【转】Java:String、StringBuffer和StringBuilder的区别
- C++ 泛型编程(一):模板基础:函数模板、类模板、模板推演成函数的机制、模板实例化、模板匹配规则
- hdfs文件如何导出到服务器,[Hadoop] 如何将 HDFS 文件导出到 Windows文件系统
- 阿里敏捷教练何勉:论精益思想及精益产品开发实践体系
- 调用高德逆地理接口_地理编码与逆地理编码
- 在线CSV转YAML工具
- Facebook提高工作效率的秘密 ,值得收藏
- 虚拟机克隆后没有IP
- 【协同任务】基于matlab蚁群算法多组群UAV协同任务路径规划【含Matlab源码 1578期】
- linux命令怎么查看日志文件,linux查看日志文件命令
- 机器学习之决策树、随机森林
- EDGE网络已落户嘉兴
- 康奈尔笔记法写程序笔记
- contiki学习笔记(四)、contiki系统UDP通信原理(单播、多播、RPL介绍)