已经是NOIP考前的最后一天了
现在在杭州的宾馆里
因为自己没带电脑
因此用ADMAN的电脑
题目描述
一维的世界就是一个数轴。这个世界的狭小我们几乎无法想象。
在这个数轴上,有N个点。从左到右依次标记为点1到N。第i个点的坐标为Xi。经过漫长时间的物理变化和化学变化,这个一维世界中产生了一个高等智慧文明,而这N个点都成为了这个文明的一座城市。而点1则成为了这个文明的首都。
出于政治上和经济上的需要,首都不能和任何城市相距太远。所以政府决定在某两个城市耗巨资修建虫洞。一个修建了虫洞的城市可以瞬移到另一个修建了虫洞的城市,从而大大缩短了N个城市相互之间的距离。原先从任意城市i到城市j的路程等于它们的距离|Xi - Xj|,而现在若两个城市附近都有修建了虫洞的城市,则可以先从i移动到附近的虫洞瞬移到城市j附近的虫洞再移动到j。
政府希望在两个合适的城市修建虫洞,使得修建虫洞以后从点1移动到任意城市经过的最短路程的最大值尽量小。请你计算这个路程的最小值是多少。
输入包含多组数据。
格式
输入格式
第一行包括一个正整数T,表示有T组测试数据。接下来依次是T组测试数据。
每组测试数据的第一行包括一个整数N,表示有N个城市。第二行,N个递增的整数,依次表示N个城市的坐标。
输出格式
输出文件包括T行,每行一个整数,依次表示每组测试数据的答案。
样例
2 3 0 1 21 5 0 100 101 102 103
1 2
思路
我觉得是一个很好的题目了
第一次提交我才10……
大致就是枚举第二个虫洞的位置
然后取值就可以
在这里附上一个大佬的题解
我的方法是O(n)的,木有下面的二分神。
题意就是加一条权值为0的边,使得最远点距离最小.
容易证明边的起点一定是1.
那么可以枚举边的终点。
假设边的终点在点X,那么可以分2部分来计算,1-X之间的点和点X+1-N.显然后面部分中最远的点是N。
对于前面部分,距离最远的点肯定是在中间的(就是它到1的距离和到X的距离尽可能接近),假设是Y,显然当X变大的时候,Y也会变大,只要移动一下就可以了。
代码
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int a[200005]; int main() { int T;scanf("%d",&T); while(T--) { int j=2; int ans=0x7fffffff; memset(a,0,sizeof(a)); int n;scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); ans=max(a[2]-a[1],a[n]-a[2]); for(int i=3;i<=n;i++) { while(j<i && a[i]-a[j]>a[j]-a[1]) ++j; ans=min(max(a[i]-a[j],max(a[j-1]-a[1],a[n]-a[i])),ans); } printf("%d\n",ans); } return 0; }