H - Pie
N个Pie平均分给F+1个人 每个人分得的Pie只能是一块
采用二分 左界为最大的Pie/F+1 右界为最大的Pie 分得的Pie不可能在这个区间外边
如果分的份数少了 左界=mid 否则右界=mid 知道误差不超过0.001为止
不知道怎么判断误差可以直接循环100次 基本都没问题
#include <iostream> #include <string.h> #include <algorithm> #include <stdio.h> #include <math.h> #include <map> #include <string> #include <set> #include <stack> #include <queue> using namespace std; #define forseach(i,j,n) for(int i=j;i<n;i++) #define debug freopen("in.txt","r",stdin),freopen("out.txt","w",stdout); #define ios ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); #define PI acos(-1) typedef long long ll; const int maxn = 1e4+10; int T,N,F; double ori[maxn]; bool abc(double x) { int ans=0; for(int i=0;i<N;i++) { ans+=int(ori[i]/x); } if(ans>=F) return 1; return 0; } int main() { //debug; ios; cin>>T; while(T--) { cin>>N>>F; F++; for(int i=0;i<N;i++) { cin>>ori[i]; ori[i]=PI*ori[i]*ori[i]; } sort(ori,ori+N); double l=ori[N-1]/F,r=ori[N-1],mid; while(abs(r-l)>0.000001) { mid=(l+r)/2; if(abc(mid)) l=mid; else r=mid; } printf("%.4f\n",mid); } return 0; }