UVA 10881 思维
2015-11-26 21:11
369 查看
UVA 10881
题目链接:
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=20&problem=1822&mosmsg=Submission+received+with+ID+16494760
题意:
n只蚂蚁在长度为L的轴上运动,超出边界会掉下去。,速度为1,碰撞时交换方向。
问T秒后蚂蚁位置和状态。
位置为0-L的值或者Fell off。在位置0-L的前提下,两只蚂蚁处于同一位置,方向输出Turning,否则输出L或者R。
思路:
大白书1.1例题5,不会做的单独拿出来写。
传说中的脑洞题。
先写了一发模拟,就是一秒一秒走(因为存在走到一半返回的情况,所以长度和时间均扩展成原来两倍的做法),妥妥TLE。
然后看题解,题解说因为速度相同,蚂蚁碰撞可以看成他们交换了运动方向。所以可以看成不碰撞的情况下求出所有的终点位置,然后每个位置依次为初始的蚂蚁相对顺序123.
源码:
题目链接:
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=20&problem=1822&mosmsg=Submission+received+with+ID+16494760
题意:
n只蚂蚁在长度为L的轴上运动,超出边界会掉下去。,速度为1,碰撞时交换方向。
问T秒后蚂蚁位置和状态。
位置为0-L的值或者Fell off。在位置0-L的前提下,两只蚂蚁处于同一位置,方向输出Turning,否则输出L或者R。
思路:
大白书1.1例题5,不会做的单独拿出来写。
传说中的脑洞题。
先写了一发模拟,就是一秒一秒走(因为存在走到一半返回的情况,所以长度和时间均扩展成原来两倍的做法),妥妥TLE。
然后看题解,题解说因为速度相同,蚂蚁碰撞可以看成他们交换了运动方向。所以可以看成不碰撞的情况下求出所有的终点位置,然后每个位置依次为初始的蚂蚁相对顺序123.
源码:
#include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> #include <iostream> #include <string> #include <cmath> using namespace std; #define LL long long const int MAXN = 10000 + 5; int p[MAXN], d[MAXN]; struct Ant { LL p, d; int mark; int turn; }ant[MAXN]; struct Tmp { LL p, d; }temp[MAXN]; char op[MAXN]; bool cmp1(Ant u, Ant v){return u.p < v.p;} bool cmp2(Ant u, Ant v){return u.mark < v.mark;} bool cmp3(Tmp u, Tmp v){return u.p < v.p;} int main() { int T; scanf("%d", &T); for(int cas = 1 ; cas <= T ; cas++){ LL len, cnt; int n; scanf("%lld%lld%d", &len, &cnt, &n); for(int i = 1 ; i <= n ; i++){ scanf("%lld%s", &ant[i].p, op); if(op[0] == 'L') ant[i].d = -1; else ant[i].d = 1; ant[i].mark = i; } sort(ant + 1, ant + n + 1, cmp1); for(int i = 1 ; i <= n ; i++){ temp[i].p = ant[i].p + ant[i].d * cnt; temp[i].d = ant[i].d; } sort(temp + 1, temp + 1 + n, cmp3); for(int i = 1 ; i <= n ; i++){ ant[i].p = temp[i].p; ant[i].d = temp[i].d; } for(int i = 1 ; i <= n ; i++){ if(i > 1 && ant[i].p == ant[i - 1].p) ant[i].turn = 1; else if(i < n && ant[i].p == ant[i + 1].p) ant[i].turn = 1; else ant[i].turn = 0; } sort(ant + 1, ant + 1 + n, cmp2); printf("Case #%d:\n", cas); for(int i = 1 ; i <= n ; i++){ if(ant[i].p < 0 || ant[i].p > len) printf("Fell off\n"); else{ printf("%lld ", ant[i].p); if(ant[i].turn == 1) printf("Turning\n"); else if(ant[i].d == -1) printf("L\n"); else printf("R\n"); } } printf("\n"); } return 0; }
相关文章推荐
- 加快QT工程编译速度
- Git与Repo入门
- 复杂写法的宏
- Hybrid选型和PhoneGap开发环境搭建
- iOS版PhoneGap原理分析
- android-Fragment
- 兔子-提高xampp中php的版本/提高php项目的版本
- 文章标题
- 安装PHP运行环境时候vcruntime140.dll问题的解决方法
- Eclipse 启动问题:'Initilizing Java Tooling' has encountered a problem(。。。)
- Java 向Hbase表插入数据报(org.apache.hadoop.hbase.client.HTablePool$PooledHTable cannot be cast to org.apac
- 《计算机网络-自顶向下方法》之蜂窝网标准和技术
- 面试题
- 日经春秋 20151126
- 抽象类
- linux应用编程笔记(12)信号量详解及互斥编程
- 了解和防止内存泄露
- 【手把手教你全文检索】Lucene索引的【增、删、改、查】
- Tomcat配置可以上传文件的用户
- JS函数重载解决方案