模拟 uva 10881 - Piotr's Ants
2014-01-10 16:47
337 查看
题目链接:
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1822
题目意思:
在一个长为L的木棒上有n只蚂蚁,告诉每只蚂蚁的开始位置和开始运动方向,蚂蚁的速度都为单位长度每秒,求经过T秒后每只蚂蚁的运行情况。
若多只蚂蚁正相遇转向输出Turning
向右输出R,向左输出L,如果走出了木棒输出Fell off
解题思路:
这题是这题的升华版:/article/1919801.html
关键理解两点:1、当蚂蚁相遇时,可以等价看成是蚂蚁交叉行进,这样的话可以把最终的位置和该位置的方向的(谢谢峰峰帮助)确定。
2、蚂蚁的相对位置是固定的,位置大的肯定是最右边的蚂蚁占据。
代码:
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1822
题目意思:
在一个长为L的木棒上有n只蚂蚁,告诉每只蚂蚁的开始位置和开始运动方向,蚂蚁的速度都为单位长度每秒,求经过T秒后每只蚂蚁的运行情况。
若多只蚂蚁正相遇转向输出Turning
向右输出R,向左输出L,如果走出了木棒输出Fell off
解题思路:
这题是这题的升华版:/article/1919801.html
关键理解两点:1、当蚂蚁相遇时,可以等价看成是蚂蚁交叉行进,这样的话可以把最终的位置和该位置的方向的(谢谢峰峰帮助)确定。
2、蚂蚁的相对位置是固定的,位置大的肯定是最右边的蚂蚁占据。
代码:
//#include<CSpreadSheet.h> #include<iostream> #include<cmath> #include<cstdio> #include<sstream> #include<cstdlib> #include<string> #include<string.h> #include<cstring> #include<algorithm> #include<vector> #include<map> #include<set> #include<stack> #include<list> #include<queue> #include<ctime> #include<bitset> #define eps 1e-6 #define INF 0x3f3f3f3f #define PI acos(-1.0) #define ll __int64 #define LL long long #define lson l,m,(rt<<1) #define rson m+1,r,(rt<<1)|1 #define M 1000000007 #pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; #define Maxn 11000 int l,n,t; struct SS { int gol,dd; }save[Maxn]; //dd=0表示向右 1表示向左 2表示正在相遇 3表示掉下去喽 struct Inf { int pos,pp; }inf[Maxn]; bool cmp1(struct SS a,struct SS b) { return a.gol>b.gol; } bool cmp2(struct Inf a,struct Inf b) { return a.pos>b.pos; } int ans[Maxn],dir[Maxn]; int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int tt; scanf("%d",&tt); for(int ca=1;ca<=tt;ca++) { scanf("%d%d%d",&l,&t,&n); for(int i=1;i<=n;i++) { int cur; char temp[3]; scanf("%d%s",&cur,temp); inf[i].pos=cur; //初始位置 inf[i].pp=i; //原始位置下标 if(*temp=='L') { save[i].gol=cur-t; //一只蚂蚁的最终位置 save[i].dd=1; //与该位置对应的方向 } else { save[i].gol=cur+t; save[i].dd=0; } } sort(save+1,save+n+1,cmp1); //对最终的位置从大到小排序 sort(inf+1,inf+n+1,cmp2); //对蚂蚁的原始位置从大到小排序 for(int i=1;i<=n;i++) //逐个处理 { if(save[i].gol>l||save[i].gol<0) //出了棒,掉下去喽 dir[inf[i].pp]=3; else { int j=i+1; //尝试是否有相同的 while(j<=n&&save[j].gol==save[i].gol) j++; j--; if(j!=i) //有多个蚂蚁的最终位置一样,相遇 { while(i!=j+1) //标注 所有蚂蚁的该位置 { ans[inf[i].pp]=save[i].gol; dir[inf[i].pp]=2; i++; } i--; } else //不是相遇位置 { ans[inf[i].pp]=save[i].gol; dir[inf[i].pp]=save[i].dd; } } } printf("Case #%d:\n",ca); for(int i=1;i<=n;i++) { if(dir[i]==3) printf("Fell off\n"); else { printf("%d ",ans[i]); if(!dir[i]) printf("R\n"); else if(dir[i]==1) printf("L\n"); else printf("Turning\n"); } } printf("\n"); } return 0; }
相关文章推荐
- UVA 10881 - Piotr's Ants【模拟+思维】
- uva 10881 Piotr's Ants (模拟)
- UVA - 10881-Piotr's Ants (模拟)
- uva_10881_Piotr's Ants (模拟,Sort)
- UVA 10881(经典模拟,trick点)
- UVA - 10881-Piotr's Ants-思路题/模拟
- 【巧妙的模拟】【UVA 10881】 - Piotr's Ants/Piotr的蚂蚁
- Uva 10881 Piotr's Ants (模拟+思维)
- 【巧妙的模拟】【UVA 10881】 - Piotr's Ants/Piotr的蚂蚁
- uva 10881 Piotr's Ants 模拟
- UVA10881 Piotr's Ants (模拟)
- [ACM_模拟] UVA 10881 Piotr's Ants[蚂蚁移动 数组映射 排序技巧]
- UVA 10881
- 紫书章六例题四 悲剧文本 UVA 11988 (用数组模拟单向链表/递归)
- Uva 177 Paper Folding(模拟?Orz)
- UVA 11039 模拟
- UVA 814 MTA 模拟
- 例题6-1 并行程序模拟 UVa210 双端队列
- uva 12100 Printer Queue 优先级队列模拟题 数组模拟队列
- Uva 10881 - Piotr's Ants