分析
题目中说的最小的满足值,那么就是二分答案Check:
每次贪心当两个端点距离小于Mid
时就增加一段
即可
代码
//P6174 #include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #include <cmath> #define LL long long #define Cl(X,Y) memset((X),(Y),sizeof(X)) #define FOR(i,A,B) for(LL i=A;i<=B;i++) #define BOR(i,A,B) for(LL i=A;i>=B;i--) #define Lowbit(X) (X & (-X)) #define Skip cout<<endl; #define INF 0x3f3f3f3f #define Rson (X<<1|1) #define Lson (X<<1) using namespace std; const LL MaxN=5e4+10; LL Total,Limit; LL Num[MaxN]; inline void File() { freopen(".in","r",stdin); freopen(".out","w",stdout); } inline bool Check(LL Temp) { LL Sum=0,L=1,R=1,Cnt=0; for(;L<=Total;L=R+1,R=L) { while(R<Total && Num[R+1]-Num[L]<=2*Temp) R++; Cnt++; } return Cnt<=Limit; } signed main() { // File(); ios::sync_with_stdio(false); cin>>Total>>Limit; FOR(i,1,Total) { cin>>Num[i]; } sort(Num+1,Num+Total+1); LL L=0,R=(Num[Total]-Num[1])>>1,Ans=(Num[Total]-Num[1])>>1; while(L<=R) { LL Mid=(L+R)>>1; if(Check(Mid)) { Ans=Mid; R=Mid-1; } else { L=Mid+1; } } cout<<Ans<<endl; // fclose(stdin); // fclose(stdout); system("pause"); return 0; }