• Uva10881 Piotr's Ants


    题意,长度为L的木棒上有n只蚂蚁,每只蚂蚁要么向左,要么向右,相撞的时候则会改变方向,问T秒后,妈妈的位置和方向

    这道题我们把蚂蚁抽象成一个个点来的话,我们会发现,蚂蚁碰撞之后,就像两个点“对穿而过:所以我们要计算出T秒后每个蚂蚁的位置

    但是T秒过后对应的位置上不一定是那只蚂蚁,可能是别的蚂蚁。我们就要搞清楚”谁是谁“

    通过模拟发现,蚂蚁经过T时间之后,相对顺序是不变的。所以我们把前后的位置排个序。则移动后的从左到右的顺序还是从左到右。但输入的时候并不是从左到右,所以我们还要用一个order数组记录输入的顺序

    AC代码如下:

    #include<stdio.h>
    #include<iostream>
    #include<math.h>
    #include<algorithm>
    using namespace std;
    const int maxn=10000+100;
    const char dirName[][10]={"L","Turning","R"};
    int order[maxn];
    struct node
    {
    	int id;
    	int p;
    	int d;
    };
    bool cmp(node A,node B)
    {
    	return A.p<B.p; 
    }
    node b[maxn],a[maxn];
    int main()
    {
    	int t,n,cas=0,T,L;
    	scanf("%d",&t);
    	while(t--)
    	{
    		scanf("%d %d %d",&L,&T,&n);
    		for(int i=0;i<n;i++)
    		{
    			int x;
    			char ch;
    			int p;
    			scanf("%d %c",&x,&ch);
    			int d=(ch=='L'?-1:1);
    			b[i].id=i;
    			b[i].p=x;
    			b[i].d=d;
    			a[i].id=0;
    			a[i].p=x+T*d;
    			a[i].d=d;
    		}
    		sort(b,b+n,cmp);
    		for(int i=0;i<n;i++)
    		order[b[i].id]=i;
    		sort(a,a+n,cmp);
    		for(int i=0;i<n-1;i++)
    		{
    			if(a[i].p==a[i+1].p)
    			{
    				a[i].d=a[i+1].d=0;
    			}
    		}
    		printf("Case #%d:
    ",++cas);
    		for(int i=0;i<n;i++)
    		{
    			int s=order[i];
    			if(a[s].p<0||a[s].p>L)
    			printf("Fell off
    ");
    			else
    			printf("%d %s
    ",a[s].p,dirName[a[s].d+1]);
    		}
    		printf("
    ");
    	}
    	return 0;
    }


  • 相关阅读:
    【洛谷P5514】永夜的报应【模拟】
    当你闲得无聊去编 C++「贪吃蛇」小游戏
    【牛客练习赛50】C
    【JZOJ3410】Tree【最小生成树】
    @Zookeeper可视化工具。 ZK 安装 node-zk-browser。2015.10.22亲测可用
    Zookeeper可视化工具。 ZK 安装 node-zk-browser。2015.10.22亲测可用
    读 Paxos 到 ZooKeeper ¥ 50大洋
    ZooKeeper 分布式锁
    UML 绘图关系
    Astah 使用 流程图、类图、时序图
  • 原文地址:https://www.cnblogs.com/NaCl/p/9580132.html
Copyright © 2020-2023  润新知