POJ3122 Pie(二分)
阿新 • • 發佈:2018-11-25
題意很簡單,有N個派,讓把派切成瞪大的塊至少F+1份,問能多大
思路:二分答案即可
注意:此題精度極高,必須用PI=4*atan(1.0)。
吐槽:百練有毒,百練有毒,百練有毒!重要的事情說三遍!
附程式碼:
附原題連結:http://poj.org/problem?id=3122#include<cmath> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int n,f,cnt,testcase; const double eps=1e-8; double s[10010]; double l,r,mid; bool work(double p){ cnt=0; for(int i=0;i<n;i++){ cnt+=floor(s[i]/p); if(cnt>=f) break; } if(cnt>=f) return true; else return false; } int main() { scanf("%d",&testcase); while(testcase--){ scanf("%d %d",&n,&f); f+=1; for(int i=0;i<n;i++){ scanf("%lf",&s[i]); s[i]=s[i]*s[i]; } sort(s,s+n); l=0;r=s[n-1]; while(r-l>=eps){ mid=(l+r)/2; if(work(mid)) l=mid; else r=mid; } printf("%.4lf\n",l*4*atan(1.0)); } return 0; }