题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1266 题意:一条长为l cm的棍子上有n个蚂蚁,每秒行走1cm已知它们距离棍子左端点的距离,但是不知道朝向(往哪个方向爬),由于棍子太细,蚂蚁相遇后只能掉头返回,问所有蚂蚁掉下棍子时的最小时间和最大时间。 思路:看起来有速度,蚂蚁又要掉头,模拟很困难,其实并不用考虑这些。无论是最小时间和最大时间,都是由最后一个掉下去的蚂蚁决定的。所以我们分别找到距离棍子中点最近和最远的蚂蚁就可以了,最近往离端点近的方向走,最远的往另一个端点走。其他蚂蚁都给它让道。
#include<cstdio> #include<queue> #include<iostream> #include<vector> #include<map> #include<cstring> #include<string> #include<set> #include<stack> #include<algorithm> #define cle(a) memset(a,0,sizeof(a)) #define inf(a) memset(a,0x3f,sizeof(a)) #define ll long long #define Rep(i,a,n) for(int i=a;i<=n;i++) using namespace std; const int INF = ( 2e9 ) + 2; const int maxn = 5e4+10; int p[maxn]; int main() { int n,l; scanf("%d%d",&n,&l); for(int i=0;i<n;i++) scanf("%d",&p[i]); int c=l/2; int v1=INF,v2=-1; for(int i=0;i<n;i++) { if(abs(p[i]-c)<v1)v1=abs(p[i]-c); if(abs(p[i]-c)>v2)v2=abs(p[i]-c); } printf("%d %d\n",l/2-v1,l/2+v2); }