题目链接

题意:

  蚂蚁在一个杆子上行走,每个蚂蚁有开始的位置,且速度都是1,如果蚂蚁“相撞”就会各自回头,以原速度继续行走,走到杆子边上就会掉下去,请问最快都掉下去的时间和最慢都掉下去的时间。

题目分析:

  读完题后,我们就想一想一些情况吧,其实最快非常显然,啥都不用想,让他们都向着容易掉下去的方向走,最后一个掉下去的就是要求的时间,简单想一下,如果这样的话他们也不会相撞(因为靠左的要向左走,靠右的要向右走,所有以中间为分界线,左边向左,右边向右,就不会相撞)。然后记录一下时间就好了。

  那么最大呢?最大就无法避免相撞的问题了,但是,这一题相撞之后所给的描述是“各自回头”,这个各自回头造成我们不好追踪某个蚂蚁,也不好确定这个蚂蚁到达做了什么贡献,所有我们进行一个巧妙的转换:我们把“各自回头”改为“互相穿过”,这其实是没有区别的,为什么呢,因为蚂蚁都是一样的,相撞之后他对面回头了,就等级与你穿过去了,这样一改,题目就显得异常简单:找每个蚂蚁掉下去的最大,然后在其中取最大(其实最小也可以这样思考)。

  好简单,其实我们还可以类比一下:如果改为一些质量相等的小球以不同的速度在无摩擦的杆子上运动,且碰撞为弹性碰撞,每个小球的初始速度不同,求最快和最慢掉下去的时间。其实是一样的。也是碰撞相当于穿过(弹性碰撞是什么应该知道吧,就是碰撞完交换速度)。最后,放一下代码(里面的处理方法可能不同,但原理类似)。

#include <cstdio>
#include <string>
using namespace std;
const int maxn=+;
int a[maxn];
int main(){
int t;
scanf("%d",&t);
for(int jsjs=;jsjs<=t;jsjs++){
int c,n;
scanf("%d%d",&c,&n);
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
int ans=;
int jl1=;
int jl2=;
for(int i=;i<=n;i++){
ans=max(ans,min(a[i],c-a[i]));
if(a[i]<a[jl1])
jl1=i;
if(a[i]>a[jl2])
jl2=i;
}
printf("%d %d\n",ans,a[jl2]-a[jl1]+max(a[jl1],c-a[jl2]));
}
return ;
}

最新文章

  1. ArcGIS API for JavaScript(2)-ArcGIS Server发布要素图层服务
  2. hadoop2.6.2分布式环境搭建
  3. Codeforces Round #202 (Div. 2) A,B
  4. inupt textarea提示文字(点击消失,不输入恢复)
  5. FlowLayoutPanel 内的控件怎么调换顺序?
  6. 【Excel】Excel筛选迟点时间的公式
  7. rxJava rxandroid 学习
  8. catalan卡特兰数
  9. carryLess开发日记_2017-05-18
  10. Python装饰器,json,pickle
  11. 简单实现ASP.Net MVC网页播放音乐
  12. html前端优化建议
  13. 金蝶K/3 BOS产品培训教案
  14. php java aes
  15. CodeForces 937C Save Energy! 水题
  16. C#-.Net Framework和.Net Compact Framework-摘
  17. X-UA-Compatible
  18. 记录.NET Core部署到Linux之.NET Core环境搭建(1)
  19. LigerUI 树状列表折叠显示
  20. Fresnel Reflection Shader

热门文章

  1. 经典文本特征表示方法: TF-IDF
  2. 一文带你快速搞懂动态字符串SDS,面试不再懵逼
  3. 第一章03-Activity的启动模式
  4. CORS跨域漏洞学习
  5. ubuntu18.04安装qt时候的错误解决
  6. springboot的坑
  7. mybatis的缓存2
  8. Jenkins项目构建运行
  9. 【案例演示】JVM之强引用、软引用、弱引用、虚引用
  10. JavaWeb网上图书商城完整项目--验证码