题意:输入n块派的半径,m个人,输出m+1个人能分到的派的最大面积。(每个人分到的派都不可以是拼接的,都得是整块的)
思路:首先在计算面积上遇到了问题,π不能是3.14,而要用acos(-1.0)来表示才够精确。本题由于不能拼接,所以直接在最大快面积和0之间使用二分来找最大面积就可以了。
感想:这个题中间还涉及到了求面积等一系列细节的处理,可见为了使用二分更顺利,需要做足准备。
代码:
<span style="font-size: 14px;">#include <stdio.h>
#include <cmath>
#include <algorithm>
using namespace std;
const double pi = acos(-1.0);
int check(double mid)
{
int i;
int sum = 0;
for(i = 0; i<n; i++)
{
sum+=int(a[i]/mid);
if(sum>=m)
return 1;
}
return 0;
}//计算最多能分几块。
int cmp(double a,double b)
{
return a>b;
}
int main()
{ </span><pre class="cpp" name="code" style="font-size: 14px; white-space: pre-wrap; word-wrap: break-word; color: rgb(54, 46, 43); line-height: 26px; background-color: rgb(255, 255, 255);"> double a[10005];
int n,m;
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:12px;"> int t,i,j;</span></span>
double l,r,mid; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); m++; for(i = 0; i<n; i++) { scanf("%lf",&a[i]); a[i] = a[i]*a[i]*pi; } sort(a,a+n,cmp); l = 0; r = a[0]; if(m<n) n = m; while(r-l>1e-5) { mid = (r+l)/2; if(check(mid)) l = mid; else r = mid; } printf("%.4lf\n",l); } return 0;}