暑假集訓——貪心專題——C題
阿新 • • 發佈:2018-12-31
貪心
題意:你有n個蛋糕,每個蛋糕為半徑不同的圓柱體,圓柱體高為1,你有f個朋友要來,現在來分蛋糕,使每個朋友所分得的蛋糕體積相同,而且不能那兩個蛋糕拼在一起給朋友,問每個朋友能拿到的蛋糕的最大體積。
思路:二分列舉答案mid,判斷所列舉的答案mid是否符合要求,如果列舉的mid不符合要求,那麼mid就太大了,r=mid。如果符合要求,就繼續找更大的mid,l=mid。
#include<iostream> #include<cstdio> #include<cmath> #define eps 1e-6 #define PI acos(-1.00) using namespace std; int n,f; int a[10001]; double v[10001]; double sum,V; bool is(double x) { int num=0; for(int i=0;i<n;i++) { if(x<=v[i]) num+=(int)(v[i]/x);//判斷每塊蛋糕可分幾塊體積為x的蛋糕 } if(num>=f+1) return true;//如果所分得蛋糕數大於朋友和自己的數量,那麼返回正確。注意自己也算進去 else return false; } int main() { int t; scanf("%d",&t); while(t--) { sum=0; scanf("%d%d",&n,&f); for(int i=0;i<n;i++) { scanf("%d",&a[i]); v[i]=PI*a[i]*a[i];//計算每塊蛋糕的體積 sum+=v[i]; } V=sum/(f+1);//求得每個人可以分得的最大體積(理想情況下) double l=0.0,r=V,mid; while((r-l)>eps)//二分搜尋答案 { mid=(l+r)/2; if(is(mid)) l=mid;//可以的話往更大地找 else r=mid;//不可以以的話往更小地找 } printf("%.4lf\n",mid); } return 0; }