因为很久没有想题目了,所以开始复健,把买的算法书,想要刷一遍复习一下。(估计写不完,苦涩)
《挑战程序设计竞赛》和紫书等算法书的习题可以参考vj上的:挑战ICPC编程 https://vjudge.net/group/challenge
本题题面:
在一根给定长度的棍子上有n只蚂蚁,给定他们的位子,不告诉行走的方向。如果两只蚂蚁相撞就会各自转向。蚂蚁每单位时间走1,当它们走到棍子两端的时候,就会掉下去。问它们掉下去的最早和最晚时间。
想法:
就是思维题。最简单的情况:如果只有一只蚂蚁/如果不考虑相撞,两个时间无非就是往左走和往右走的时间。现在有相撞转向,但是想一下他俩相撞时是同一个时间点,那么即使他们转向了,再相加的时间也是各自原来不转向的时间。所以其实就是回到不考虑相撞的情况下写。所以只要考虑每只蚂蚁掉下去的短的时间和长的时间,然后短的时间取最大值就是总的最短时间,长的时间取最大值就是总的最长时间。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
int t;
int pos;
int maxt,mint;
int len,n;
int main()
{
int t;
scanf("%d",&t);
while(t--){
scanf("%d%d",&len,&n);
maxt=-0x3f3f3f3f;
mint=maxt;
for(int i=0;i<n;++i){
scanf("%d",&pos);
int lt=pos;
int rt=len-pos;
maxt=max(maxt,max(lt,rt));
mint=max(mint,min(lt,rt));
}
printf("%d %d\n",mint,maxt);
}
}