题意:给一个数列(整数),用一些不相交的区间去覆盖(只能是用端点去覆盖,端点可以交)。而且区间出度相等。求最大区间长度。
开始一下就敲了,枚举每个区间长度,判断合法,更新最大。但是后来一看小数,感觉不行,改为二分,后来还是挂了。。。
赛后才知道,二分的时候,答案必需要满足单调性啊,这里小的数据不行,大的数据可以行!如 0 1 5 6 10, 3不行,4行。
后来才知道,枚举时,每个差值的一半也是可以的:仔细想想很容易证明。(水,坑)
#include
#include
#include
#include
using namespace std; vector
v; int n; bool ok(double tmax) { int fl=-1; for(int j=1;j
dis; int main() { int T; cin>>T; while(T--) { cin>>n; int tx=0; v.clear(); dis.clear(); for(int i=0;i
>tx; v.push_back(tx); } sort(v.begin(),v.end()); for(int i=0;i
=0;i--) { if(ok(dis[i])) { printf("%.3lf\n",dis[i]); break; } } } return 0; }