标签:
题解:将n个蛋糕分给m+1个人,但是每个人只能拿到一块(不能拼凑),每块大小要相同(形状不用相同),问每个人最多能分到多大的蛋糕(面积)。思路是先求出面积,用数组保存,并排序。L为0,R为最大的那个蛋糕的面积,然后二分搜索。
#include <cstdio> #include <iostream> #include <string> #include <sstream> #include <cstring> #include <stack> #include <queue> #include <algorithm> #include <cmath> #include <map> #define PI acos(-1.0) #define ms(a) memset(a,0,sizeof(a)) #define msp memset(mp,0,sizeof(mp)) #define msv memset(vis,0,sizeof(vis)) using namespace std; //#define LOCAL int n,m; double a[10001]; bool check(double x) { int cnt=0; for(int i=0; i<n; i++) { cnt+=int(a[i]/x); if(cnt>=m)return 1; } return 0; } bool cmp(double a,double b) { return a>b; } int main() { #ifdef LOCAL freopen("in.txt", "r", stdin); #endif // LOCAL ios::sync_with_stdio(false); int N; cin>>N; while(N--) { //int n,m; cin>>n>>m; m++; ms(a); for(int i=0; i<n; i++) { cin>>a[i]; a[i]=a[i]*a[i]*PI; } sort(a,a+n,cmp); double l=0,r=a[0],mid; if(m<n)n=m;//即使前面m个不够,后面的也没用,这样可以省点时间 while(r-l>1e-5) { mid=(r+l)/2; if(check(mid))l=mid; else r=mid; } printf("%.4lf\n",l); } return 0; }
标签:
原文地址:http://www.cnblogs.com/gpsx/p/5182138.html