背景:挑战程序设计竞赛上的题,好思维。来就想暴力枚举都还没有仔细思考有没有数学规律,n超过20就不适合用2的n次方的算法了。
思路:最短时间十分容易讨论,这里最大时间很巧妙,两只蚂蚁相撞然后各自反向走,可以想成两只蚂蚁绕过,各走各的,这样早最大时间就简单了,就是所有走到端点的时间中最大的。
代码:
#include <cstdio> #include <cstdlib> #include <iostream> #include <algorithm> #include <cstring> #include <map> #include <queue> #include <vector> #include <set> #include <stack> using namespace std; typedef long long int LL; const int M=100009,INF=0x3fffffff; int t,n,temp; int main(void){ scanf("%d",&t); while(t--){ int minans=0,maxans=0,T; scanf("%d%d",&n,&T); for(int i=1;i <= T;i++){ scanf("%d",&temp); minans=max(minans,min(n-temp,temp)); maxans=max(maxans,max(n-temp,temp)); } printf("%d %d\n",minans,maxans); } return 0; }
时间: 2024-11-06 11:57:14