UVA 10881 - Piotr's Ants 蚂蚁
2015-12-16 20:01
274 查看
#include<iostream> #include<algorithm> #include<cstdio> #include<string> using namespace std; const int maxn = 10005; const char s[][10] = {"L","Turning","R"}; struct ant { int first; //对输入的蚂蚁进行编号 int p; //位置 int l; //方向,-1为左,0为碰撞,1为右 bool operator < (const ant &x) const{ //重载运算符,进行结构体的比较 return p < x.p; } }before[maxn], after[maxn]; int main() { //freopen("a.txt","w",stdout); int TT, kase = 0; string c; cin >> TT; while(TT--){ printf("Case #%d:\n",++kase); int L, T, N, i; scanf("%d%d%d",&L,&T,&N); for(i = 0; i < N; i++){ int p, l; cin >> p >> c; l = c == "L" ? -1 : 1; before[i] = (ant){i,p,l}; after[i] = (ant){0,p+l*T,l}; } int order[maxn]; //输入的第i只蚂蚁是终态中左数第order[i]只蚂蚁 sort(before, before+N); for(i = 0; i < N; i++) order[before[i].first] = i; sort(after, after+N); for(i = 0; i < N; i++) if(after[i].p == after[i+1].p) after[i+1].l = after[i].l = 0; for(i = 0; i < N; i++){ int a = order[i]; if(after[a].p < 0 || after[a].p > L) cout << "Fell off" << "\n"; else printf("%d %s\n",after[a].p, s[after[a].l+1]); } printf("\n"); } }
刚接触这个题时,第一想法是暴力,可是题目给的数据实在是太大了,暴力的运算量能达到10的十几次方,显然超时。苦想很久后,没有什么 好的思路,无奈看了蓝书的答案。
细细分析,蚂蚁的运动过程还是有规律可循的,如果把蚂蚁看作很小的点,那么蚂蚁碰撞掉头时,很两个点对穿而过没有什么区别,所以可以用初始位置 + 时间*方向(可以设左为-1,右为1)来表示终态位置,只是相应的对象变了,也就是说算出的终态位置所对应的蚂蚁并不一定是一开始的那只蚂蚁。还有一个规律,那就是每只蚂蚁的相对顺序是不变的,一两只蚂蚁为例,假设A在左边并朝右走,B在右边并朝左走,那么两只蚂蚁碰撞后A朝左走B朝右走,A仍然在B的左边,多只蚂蚁类比推之。也就是说,不管碰撞多少次,谁在谁的左边谁在谁的右边这是不会发生变化的。所以可以对蚂蚁的起始及终点位置进行排序,这样每只蚂蚁及其终点位置就对上号了。对于第一个规律中提到的那种情况,只要建一个数组,把他们的起始输入顺序和终态顺序分别用下标及相对应的元素值表示,这样二者就对应起来了。
相关文章推荐
- 例题5 UVA 10881 蚂蚁(Piotr's Ants)
- Windows10 IoT 无线网卡支持
- 物联网碰壁后,这位创业者总结失败五大原因
- 浅析工业级物联网项目的快速开发
- 总结:ARM逻辑和高级C(朱老师物联网学习)
- 物联网随想二三事
- Windows 10 IoT Serials 3 - Windows 10 IoT Core Ardunio Wiring Mode
- Linux 查看哪些进程占用磁盘IO (iotop工具)
- 4.物联网和云计算及大数据
- 人人都能开发物联网(三.究竟想玩些什么呢?)
- 人人都能开发物联网(二.技术路线)
- 人人都能开发物联网(一.目标)
- 人人都能开发物联网
- AudioTrack 分析
- Java 网络编程(Elliotte Rusty Harold)
- Linux进程实时IO监控iotop命令
- 物联网概念思考
- 物联网安全拔“牙”实战——低功耗蓝牙(BLE)初探
- OPNET-物联网仿真代码及软件使用
- iotop监测工具的使用