/*
n只蚂蚁以每秒1cm的速度在长为Lcm的竿子上爬行。
当蚂蚁爬到竿子的端点时就会掉落。
由于竿子太细,两只蚂蚁相遇时,它们不能交错通过,只能各自反向爬回去。
对于每只蚂蚁,我们知道它距离竿子左端的距离xi,但不知道它当前的朝向。
请计算各种情况当中,所有蚂蚁落下竿子所需的最短时间和最长时间。
*/

/*
n只蚂蚁以每秒1cm的速度在长为Lcm的竿子上爬行。
当蚂蚁爬到竿子的端点时就会掉落。
由于竿子太细,两只蚂蚁相遇时,它们不能交错通过,只能各自反向爬回去。
对于每只蚂蚁,我们知道它距离竿子左端的距离xi,但不知道它当前的朝向。
请计算各种情况当中,所有蚂蚁落下竿子所需的最短时间和最长时间。
*/
#include<cstdio>
#include<iostream>
using namespace std;
#define M 1000
int L,n;
int x[M];
void solve(){//计算最短时间 ,最短时间的情况下,蚂蚁都朝着近的一段爬去,不会相遇。//求这种情况下最后一只蚂蚁落下用的时间 int minT=0;for(int i=0;i<n;i++){minT=max(minT,min(x[i],L-x[i]));}//计算最长时间,相遇时当作两只蚂蚁交错而过,可以看作独立运动。//求每只蚂蚁朝着离断点远的方向走,最后一只蚂蚁落下所用时间。 int maxT=0;for(int i=0;i<n;i++){maxT=max(maxT,max(x[i],L-x[i]));}printf("%d %d\n",minT,maxT);
}
int main(){cin>>L>>n;for(int i=0;i<n;i++){cin>>x[i];}solve();return 0;
}    

然后,题被改了。
/*
n只蚂蚁以每秒1cm的速度在长为Lcm的竿子上爬行。当蚂蚁爬到竿子的端点时就会掉落。
由于竿子太细,两只蚂蚁相遇时,它们不能交错通过,只能各自反向爬回去。对于每只蚂蚁,
我们知道它距离竿子左端的距离Xi,并知道它初始的朝向。
请计算 最后落下的蚂蚁编号和落下的时间。
输入第一行,第一个数是L,第二个数是n,接下来一行是2n个整数,每个数之间有空格隔开,每两个数表示一只蚂蚁的Xi和它的朝向,1表示向前(即向X比较大的方向),0表示向后(即向X=0的方向)
输出两个整数,最后落下的蚂蚁号(从0开始记)和最后的时间,不要回车,如果有多个最后落下的蚂蚁,输出编号最大的。
样例输入:
39 4
19 1 10 0 14 1 25 0
输出样例:
2 25
*/
这个是用最冒泡法排的顺序

/*
n只蚂蚁以每秒1cm的速度在长为Lcm的竿子上爬行。当蚂蚁爬到竿子的端点时就会掉落。
由于竿子太细,两只蚂蚁相遇时,它们不能交错通过,只能各自反向爬回去。
对于每只蚂蚁,我们知道它距离竿子左端的距离Xi,并知道它初始的朝向。
请计算:最后落下的蚂蚁编号和落下的时间。
输入第一行,第一个数是L,第二个数是n,接下来一行是2n个整数,
每个数之间有空格隔开,每两个数表示一只蚂蚁的Xi和它的朝向,
1表示向前(即向X比较大的方向),0表示向后(即向X=0的方向)
输出两个整数,最后落下的蚂蚁号(从0开始记)和最后的时间,不要回车,
如果有多个最后落下的蚂蚁,输出编号最大的。
样例输入:
39 4
19 1 10 0 14 1 25 0
输出样例:
2 25
*/
#include<cstdio>
#include<iostream>
using namespace std;
#define M 5000
int L,n;
int x[M],d[M];
void solve(){int maxT=0,T,temp;for(int i=0;i<n;i++){if(d[i]==0) T=x[i];else T=L-x[i];maxT=max(maxT,T);}//求最后一只蚂蚁掉落时的时间 for(int i=0;i<n;i++){if(d[i]==0) x[i]=x[i]-maxT;else x[i]=x[i]+maxT;}//求在maxT时,各只蚂蚁的位置(假设蚂蚁仍旧在这条直线上) for(int i=0;i<n-1;i++){for(int j=0;j<n-i-1;j++){if(x[j]>x[j+1]){temp=x[j];x[j]=x[j+1];x[j+1]=temp;}}}//抽签法求顺序,用<algorithm>库中的sort函数更好for(int i=0;i<n;i++){if(x[i]==0||x[i]==L) temp=i;}cout<<temp<<' '<<maxT;
}
int main(){cin>>L>>n;for(int i=0;i<n;i++){cin>>x[i]>>d[i];}solve();return 0;
}

然后其实有一个神仙函数很好用sort()

/*
n只蚂蚁以每秒1cm的速度在长为Lcm的竿子上爬行。当蚂蚁爬到竿子的端点时就会掉落。
由于竿子太细,两只蚂蚁相遇时,它们不能交错通过,只能各自反向爬回去。
对于每只蚂蚁,我们知道它距离竿子左端的距离Xi,并知道它初始的朝向。
请计算:最后落下的蚂蚁编号和落下的时间。
输入第一行,第一个数是L,第二个数是n,接下来一行是2n个整数,
每个数之间有空格隔开,每两个数表示一只蚂蚁的Xi和它的朝向,
1表示向前(即向X比较大的方向),0表示向后(即向X=0的方向)
输出两个整数,最后落下的蚂蚁号(从0开始记)和最后的时间,不要回车,
如果有多个最后落下的蚂蚁,输出编号最大的。
样例输入:
39 4
19 1 10 0 14 1 25 0
输出样例:
2 25
*/
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
#define M 5000
int L,n;
int x[M],d[M];
void solve(){int maxT=0,T,temp;for(int i=0;i<n;i++){if(d[i]==0) T=x[i];else T=L-x[i];maxT=max(maxT,T);}//求最后一只蚂蚁掉落时的时间 for(int i=0;i<n;i++){if(d[i]==0) x[i]=x[i]-maxT;else x[i]=x[i]+maxT;}//求在maxT时,各只蚂蚁的位置(假设蚂蚁仍旧在这条直线上) sort(x,x+n);//用<algorithm>库中的sort函数对数组进行排序for(int i=0;i<n;i++){if(x[i]==0||x[i]==L) temp=i;}cout<<temp<<' '<<maxT;
}
int main(){cin>>L>>n;for(int i=0;i<n;i++){cin>>x[i]>>d[i];}solve();return 0;
}

先这样了,有优化的话再更新。

POJ 1852 蚂蚁问题相关推荐

  1. poj 1852 Ants

    题目:http://poj.org/problem?id=1852 本题如果从常规的思想出发去解决问题是比较复杂的,而且时间复杂度会比较高,极有可能超时,但本书给出了一个非常巧妙的解法,程序简单易懂, ...

  2. 【ACM】POJ 1852

    [问题描述] 一队蚂蚁在一根水平杆上行走,每只蚂蚁固定速度 1cm/s. 当一只蚂蚁走到杆的尽头时,立即从秆上掉落. 当两只蚂蚁相遇时它们会掉头向相反的方向前进. 我们知道每只蚂蚁在杆上的初始位置, ...

  3. poj 1852 Ants_贪心

    题目大意:很多的蚂蚁都在长度为L(cm)的膀子上爬行,它们的速度都是1cm/s,到了棒子终端的时候,蚂蚁就会掉下去.如果在爬行途中遇到其他蚂蚁,两只蚂蚁的方向都会逆转.已知蚂蚁在棒子的最初位置坐标,但 ...

  4. POJ 1852 Ants O(n)

    题目: 思路:蚂蚁相碰和不相碰的情况是一样的,相当于交换位置继续走. 代码: #include <iostream> #include <cstdio> #include &l ...

  5. POJ 1852 Ants 分析

    1.暴搜 每只蚂蚁朝向有两种,可以枚举n只蚂蚁的朝向,然后模拟蚂蚁相遇的情景,总共2^n中情况. 2.分析ants相碰的情况: (a->)  (<-b) 变成 (<-a)(b-> ...

  6. Ants(POJ 1852)

    题目大意:一个蚂蚁群在一个杆子上爬,爬到杆子的末端时就会掉落,如果两只蚂蚁碰面,那么两只蚂蚁会反向走,问所有蚂蚁掉落的最短时间和最长时间.我们已知杆子的长度和蚂蚁的数量和每只蚂蚁的位置(即其距离杆子左 ...

  7. 【题解】POJ 1852 Ants(搜索)

    POJ1852 Ants 目录 POJ1852 Ants 原题 题意 题解 原题 An army of ants walk on a horizontal pole of length l cm, e ...

  8. 水题/poj 1852 Ants

    1 /* 2 PROBLEM:poj1852 3 AUTHER:Nicole 4 MEMO:水题 5 */ 6 #include<cstdio> 7 using namespace std ...

  9. 【思维】Hzy's Rabbit Stick

    题目描述 给兔兔们染完颜色后,Hzy把n只颜色不同的兔兔放在了一根长度为L=10n的木棍的不同位置(每只兔兔的位置在[0,L]之间)上,让她们做做运动. 在最开始的时候,Hzy会给每只兔兔指定一个方向 ...

最新文章

  1. 关于PKI架构(使用证书)保护Web访问的安全实现SSL的基本理论
  2. LeetCode【217. Contains Duplicate】
  3. java 实现支持向量机
  4. python email模块写邮件_python常用模块email----创建简单的文本邮件并发送
  5. 判断js中数据类型 的最短代码
  6. cmd查看某个服务器端口状态,cmd中检测端口是否处于监听状态 | IT博客
  7. CSS中Position定位属性的使用
  8. 谈谈我们如何发现 VMware vCenter 的越权 RCE
  9. NoSQL之【MongoDB】学习(二):DML和查询操作说明
  10. 虚拟服务器和虚拟主机(空间)的区别
  11. 概览Visual Studio 15.3的第二个预览版
  12. mysql windows下连接linux下的mysql
  13. 自己上手搭建VUE项目
  14. 栈的压入、弹出序列和栈所有可能的弹出顺序
  15. html中亮度怎么写,HTML+CSS+JS模仿win10亮度调节效果的示例代码
  16. sentry mysql_Apache Sentry安装及简单使用
  17. 【设计模式】Java 语言不同的编程范式-第1章
  18. python存csv中文乱码问题
  19. 蓝桥杯真题:天干地支
  20. 【HJ42 学英语】C++

热门文章

  1. 汇编语言DW、DB和DD的区别
  2. Linux系统编程——线程
  3. 06 nginx 处理转发其他域的处理 以及 proxy_redirect
  4. MSIC-find me
  5. python3应用程序代码_Python高级应用程序设计
  6. 物联网是什么?物联网的关键技术是什么?
  7. 5分绩点转4分_意甲最新积分榜:AC米兰完胜5分领跑,那不勒斯4球横扫罗马
  8. matlab 实现2048游戏
  9. 809*??=800*??+9*??
  10. 库卡kuka仿真软件sim Pro 3.1简单实用教程