这题显然优先找大的
直到找不下去了,判断无解或者拿个与需要的分水器相等的(显然有)
因为一个k的分水器只能增加k-1条通道
所以列方程
#include<cstdio> #include<cstring> #include<cstdlib> #include<cctype> #include<iostream> using namespace std; #define MAXN (1000000000000000000) #define MAXK (1000000000) long long n,k; long long bin_s(long long l,long long r) { if (n==1) return 0; while (r-l>1) { long long m=(l+r)/2; if ((m+k-1)*(k-m)>2*(n-1)) l=m; else r=m; } if ((l+k-1)*(k-l)>2*(n-1)) l=r; if ((l+k-1)*(k-l)<2*(n-1)) l--; if (l==0) return -1; return k-l; } int main() { cin>>n>>k; cout<<bin_s(1,k-1)<<endl; return 0; }原文链接:https://www.f2er.com/javaschema/286378.html