蚂蚁问题

最近做了几个蚂蚁问题,还蛮有趣的。。。。。

蚂蚁问题第一弹:poj 1852 Ants:

Ants

Time Limit: 1000MS   Memory Limit: 30000K
Total Submissions: 12214   Accepted: 5366

Description

An army of ants walk on a horizontal pole of length l cm, each with a constant speed of 1 cm/s. When a walking ant reaches an end of the pole, it immediatelly falls off it. When two ants meet they turn back and start walking in opposite directions. We know the original positions of ants on the pole, unfortunately, we do not know the directions in which the ants are walking. Your task is to compute the earliest and the latest possible times needed for all ants to fall off the pole.

Input

The first line of input contains one integer giving the number of cases that follow. The data for each case start with two integer numbers: the length of the pole (in cm) and n, the number of ants residing on the pole. These two numbers are followed by n integers giving the position of each ant on the pole as the distance measured from the left end of the pole, in no particular order. All input integers are not bigger than 1000000 and they are separated by whitespace.

Output

For each case of input, output two numbers separated by a single space. The first number is the earliest possible time when all ants fall off the pole (if the directions of their walks are chosen appropriately) and the second number is the latest possible such time.

Sample Input

2
10 3
2 6 7
214 7
11 12 7 13 176 23 191

Sample Output

4 8
38 207

题意:一根木棒上有很多蚂蚁,给出这些蚂蚁初始时离木棒左端的距离,当然这些蚂蚁一开始是向左爬还是向右爬是未知的。由于木棒很细,因此如果两只蚂蚁碰到了它们会各自掉头继续爬,问这些蚂蚁全都掉下去最少和最多需要多少时间。

题解:首先可以确定两只蚂蚁相撞之后速度大小不变,只是换了一个方向而已,而且我们要求的是时间大小,具体是哪一只没差。那么可以把每一只蚂蚁相撞的情况看成是穿过。那么这一只蚂蚁要走的路的长短取决于方向即:L(木棒长)-X(初始位置)或者  X。

#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
    int T,L,n;
    cin>>T;
    while(T--)
    {
     int temp,cc,Min=-1e9,Max=-1e9;
     cin>>L>>n;
     for(int i=0;i<n;i++)
     {
         cin>>temp;
         cc=min(L-temp,temp);
         Min=max(cc,Min);
         cc=max(L-temp,temp);
         Max=max(cc,Max);
     }
     cout<<Min<<" "<<Max<<endl;
    }
    return 0;
}

蚂蚁问题第二弹:UVA 10881 Piotr‘s Ants

一根长度为L厘米的木棍上有n只蚂蚁,每只蚂蚁要么往左爬要么往右爬,速度为1cm/s。当两只蚂蚁相遇时,二者同时掉头(掉头时间忽略不计)。给出每只蚂蚁的初始位置和朝向,计算T秒之后蚂蚁的位置。

输入第一行为数据组数。每组第一行为三个整数L,T,n(n≤10 000);以下n行描述一只蚂蚁的初始位置,其中,整数x为蚂蚁距左端的距离(单位:厘米),字母表示初始朝向(L向左,R向右)。

对于每组数据,输出n(Case #n:),按输入顺序输出每只蚂蚁的位置和朝向(Turning表示正在碰撞)。在T秒之前已经掉落的蚂蚁(正好爬到边缘不算)输出Fell off

样例输入:

2

10 1 4

1 R
5 R
3 L
10 R

10 2 3

4 R
5 L
8 R

样例输出:

Case #1:

2 Turning

6 R

2 Turning

Fell off

Case #2:

3 L

6 R

10 R

题意:同样是蚂蚁爬杆问题,不过这道题相比上一道题增加了一些难度,他会告诉你蚂蚁的初始爬行方向,要你求出T秒后蚂蚁的位置以及爬行方向

思路:首先我们可以知道,由于存在这么一个条件:两只蚂蚁如果碰头了那么它们就会反向掉头,又因为所有的蚂蚁速度都是相同的大小,那么除了那些掉下去的蚂蚁,所有的蚂蚁位置都是不变的,比如说1号蚂蚁在2号蚂蚁的左边,那么不论它们走多久,1号蚂蚁都不会走到2号蚂蚁的右边。因此我们可以对所有蚂蚁的位置进行一次排序,那么在行走前和行走后蚂蚁们的相对位置都是不变的,就可以解决掉判断是否是turnning这种情况了,然后就是和上道题一样的解法,可以把相撞的情况看成是穿过。。。。

#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
const int maxn=1e4+10;
struct node
{
    int id,p,d;
    bool operator < (const node &another) const
    {
        return p<another.p;
    }
}a[maxn],c[maxn];
int idx[maxn];

int main()
{
    int T,ca=1;
    cin>>T;
    while(T--)
    {
     int l,t,n;
     cin>>l>>t>>n;
     for(int i=0;i<n;i++)
     {
         char ch;
         scanf("%d %c",&a[i].p,&ch);
         switch(ch)
         {
             case ‘R‘:a[i].d=1;break;
             case ‘L‘:a[i].d=-1;break;
         }
         c[i].p=a[i].p;
         c[i].id=i;
         a[i].p+=t*a[i].d;
         if(a[i].p<0||a[i].p>l) a[i].d=0;
     }
     sort(c,c+n);
     sort(a,a+n);
     for(int i=0;i<n-1;i++)
     {
         if(a[i].p==a[i+1].p) a[i].d=a[i+1].d=2;
     }
     for(int i=0;i<n;i++)
     idx[c[i].id]=i;
     sort(idx,idx+n);
     cout<<"Case #"<<ca++<<":"<<endl;
     for(int j=0;j<n;j++)
     {
        int i=idx[j];
        switch(a[i].d)
        {
            case -1:cout<<a[i].p<<" "<<"L"<<endl;break;
            case  0:cout<<"Fell off"<<endl;break;
            case  1:cout<<a[i].p<<" "<<"R"<<endl;break;
            case  2:cout<<a[i].p<<" "<<"Turning"<<endl;break;
        }
     }
     puts("");
    }
    return 0;
}

蚂蚁问题第三弹:NYOJ 990

描述

长100厘米的细长直杆子上有n只蚂蚁。它们的头有的朝左,有的朝右。 每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒。 当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行。 这些蚂蚁中,有1只蚂蚁感冒了。并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁。 请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒。

输入

第一行输入一个整数n (1 < n < 50), 表示蚂蚁的总数。
接着的一行是n个用空格分开的整数 Xi (-100 < Xi < 100), Xi的绝对值,表示蚂蚁离开杆子左边端点的距离。正值表示头朝右,负值表示头朝左,数据中不会出现0值,也不会出现两只蚂蚁占用同一位置。其中,第一个数据代表的蚂蚁感冒了。

输出

要求输出1个整数,表示最后感冒蚂蚁的数目。

样例输入
3
5 -2 8
5
-10 8 -20 12 25
样例输出
1
3
 
思路:做这道题一定要注意,只有第一只蚂蚁的感冒具有传染性。可以把第一只蚂蚁看做一个中间感染源,那么可以确定这只蚂蚁的左边的往左远离它的蚂蚁以及右边的往右远离它的蚂蚁都是安全的,有危险的左边往右的以及右边往左的,而且由于蚂蚁的循环掉头,可以确定这些蚂蚁都会被感染。当然,如果这只感染源蚂蚁向左而他左边不存在左边向右的那么他就感染不到别的蚂蚁了
 

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
using namespace std;
int sum1,sum2;
void judge(int a1,int a2)
{
    if((a2>0)&&(abs(a1)>abs(a2))) sum1++;
    if((a2<0)&&(abs(a1)<abs(a2))) sum2++;
}
int main()
{
    int n;
    while(cin>>n)
    {
        int t,cc;
        cin>>t;
        sum1=0;sum2=0;
        for(int i=0;i<n-1;i++)
        {
            cin>>cc;
            judge(t,cc);
        }
        if(t<0&&sum1==0||t>0&&sum2==0)
        cout<<1<<endl;
        else
        cout<<sum1+sum2+1<<endl;
    }
    return 0;
}

时间: 2024-10-26 13:33:47

蚂蚁问题的相关文章

多个蚂蚁过独木桥,求通过的最长时间和最短时间

首先对题目进行分析: 求最长时间也就是最后掉下去的一只蚂蚁需要经历的最长时间: 求最短时间也就是最后掉下去的一只蚂蚁需要经历的最短时间:所以让所有的蚂蚁都向距离它们最近的那一段走,这样它们每个走的时间是短的,再求它们中用时最短的那个时间: 分析最长时间如下图所示: /************************************************************************* > File Name: 162.cpp > Author: > Mail:

2017辽宁冬令营-4.蚂蚁

蚂蚁(ant.pas/c/cpp)题目大意在平面上有 N 只蚂蚁 N 个树洞,每个树洞只能容纳下一只蚂蚁,蚂蚁们都是直线行走的. 现在蚂蚁们希望能进入树洞中, 希望你能构造出一种方案使得任意两个蚂蚁的路线不相交.保证不会出现三点共线的情况.对于有多种不同的解,输出任意一组即可.无解时,输出-1.输入文件输入文件为 ant.in.第一行为一个数 N.接下来 N 行,每行两个非负整数,第 i+1 行为第 i 号蚂蚁的坐标.接下来 N 行,每行两个非负整数,第 i+N+1 行为第 i 号树洞的坐标.输

[zz]蟑螂蚂蚁蚊子已不住在我家了!这个方法100%见效…

http://mt.sohu.com/20150324/n410238511.shtml 蚂蚁怕酸,蚊子怕辣,蟑螂怕香.在下给各位提供一个不杀生又能驱赶蚂蚁.蚊子.蟑螂的妙法. 一.蚂蚁怕酸味 家里的甜食摆没几分钟,蚂蚁大军立即来袭,让人又气又厌,献给各位一项无毒无污染又安全有效的妙招: 整粒的新鲜柠檬,对切成两半,在看得到蚂蚁的地方及其动线,挤出柠檬汁,并拿着切半有果肉的那一面,沿途涂抹,神奇效果让您再一次验证大自然的奥妙! 二.蚊子怕辣味 蒜头呛退.将蒜头分植于花坛四周,其特殊的辛辣味隐隐飘

懒蚂蚁效应:成功的秘诀在于懒于杂物,勤于思考

概念:懒蚂蚁效应 日本北海道大学进化生物研究小组对一群黑蚂蚁进行了研究.他们把蚂蚁分为三个小组,每组30只,观察他们的行为.研究人员发现,大部分蚂蚁都很勤快地工作,寻找.搬运食物,但是却有少部分蚂蚁好像整天无所事事一样地东张西望. 研究人员在这群蚂蚁身上做上标记,并把这群蚂蚁称为:懒蚂蚁,然后,断绝了整个蚁群的食物来源.有趣的是,这时候那些平时工作很勤快的蚂蚁,突然都不知所措了,而那些"懒蚂蚁"们却挺身而出,带领蚂蚁们向他们侦查到的其它食物转移. 原来,这些"懒蚂蚁"

[OpenJudge 3064]坠落的蚂蚁

试题描述 一根长度为1米的木棒上有若干只蚂蚁在爬动.它们的速度为每秒一厘米或静止不动,方向只有两种,向左或者向右.如果两只蚂蚁碰头,则它们立即交换速度并继续爬动.三只蚂蚁碰头,则两边的蚂蚁交换速度,中间的蚂蚁仍然静止.如果它们爬到了木棒的边缘(0或100厘米处)则会从木棒上坠落下去.在某一时刻蚂蚁的位置各不相同且均在整数厘米处(即1,2,3,…99厘米),有且只有一只蚂蚁A速度为0,其他蚂蚁均在向左或向右爬动.给出该时刻木棒上的所有蚂蚁位置和初始速度,找出蚂蚁A从此时刻到坠落所需要的时间. 输入

九度oj 题目1159:坠落的蚂蚁

题目描述: 一根长度为1米的木棒上有若干只蚂蚁在爬动.它们的速度为每秒一厘米或静止不动,方向只有两种,向左或者向右.如果两只蚂蚁碰头,则它们立即交换速度并继续爬动.三只蚂蚁碰头,则两边的蚂蚁交换速度,中间的蚂蚁仍然静止.如果它们爬到了木棒的边缘(0或100厘米处)则会从木棒上坠落下去.在某一时刻蚂蚁的位置各不相同且均在整数厘米处(即1,2,3,…99厘米),有且只有一只蚂蚁A速度为0,其他蚂蚁均在向左或向右爬动.给出该时刻木棒上的所有蚂蚁位置和初始速度,找出蚂蚁A从此时刻到坠落所需要的时间. 输

蓝桥--兰顿蚂蚁

兰顿蚂蚁 时间限制:1.0s   内存限制:256.0MB 问题描述 兰顿蚂蚁,是于1986年,由克里斯·兰顿提出来的,属于细胞自动机的一种. 平面上的正方形格子被填上黑色或白色.在其中一格正方形内有一只“蚂蚁”. 蚂蚁的头部朝向为:上下左右其中一方. 蚂蚁的移动规则十分简单: 若蚂蚁在黑格,右转90度,将该格改为白格,并向前移一格: 若蚂蚁在白格,左转90度,将该格改为黑格,并向前移一格. 规则虽然简单,蚂蚁的行为却十分复杂.刚刚开始时留下的路线都会有接近对称,像是会重复,但不论起始状态如何,

UVALive 4043 Ants 蚂蚁(二分图最佳完美匹配)

题意:n个蚂蚁n棵树,蚂蚁与树要配对,在配对成功的一对之间连一条线段,要求所有线段不能相交.按顺序输出蚂蚁所匹配的树. 思路:这个题目真是技巧啊,如果知道要求的就是整体最优,那么就容易做了.而不能用贪心来为每个蚂蚁选择最近的树,这样可能八成还是相交了. 整体最优能让每条线段不相交,证明: 假设a1-b1与a2-b2相交.则dis(a1,b1)+dis(a2,b2)>=dis(a1,b2)+dis(a2,b1).如果我们所决定的最优匹配是按照整体距离最短来匹配的,那么dis(a1,b1)+dis(

╮(╯▽╰)╭ 数蚂蚁

╮(╯▽╰)╭ 数蚂蚁 TimeLimit: 2000/1000 MS (Java/Others)  MenoryLimit: 65536/32768 K (Java/Others) 64-bit integer IO format:%I64d Problem Description Lh Boy无聊的时候很喜欢数蚂蚁,而且,还给每一只小蚂蚁编号,通过他长期的观察和记录,发现编号为i的蚂蚁会和编号为j的蚂蚁在一起. 现在问题来了,他现在只有他的那本记录本,然而,他想要知道,他所观察的蚂蚁中,有多