open judge1.10 05题(二分)

open judge1.10 05
我开始的思路是先比较人数和派的数量open judge1.10 05题(二分)_第1张图片
这里并没有说明人数比派数多
所以要讨论人数与派的大小关系(我觉得我这个思路没问题)
接下来如果派大于人数 找到和人数相等的最小的那个派的体积,输出;
如果人数大于派数 (我这里错了)找到最大的派然后仅仅之将他分成多份;
下面是我的错误代码

#include
#include
#include
#include
double s[10010];
using namespace std;
int main()
{
	int a,b;
	double v=3.1415926;
	cin>>a>>b;
	for(int i=0;i<a;i++)
		cin>>s[i];
	sort(s,s+a);
	if(a<b+1)
	{
		cout<<fixed<<setprecision(3)<<v*s[a-1]*s[a-1]/(b+2-a);
	}
	else if(a>b+1)
	{
		cout<<fixed<<setprecision(3)<<v*s[a-b-1]*s[a-b-1]*s[a-b-1]*s[a-b-1];
	}
	else
	cout<<fixed<<setprecision(3)<<v*s[0]*s[0];
	return 0;
}

在看了答案后
1 答案没有派数小于人数的情况
2 我的代码并没有用到本节的知识
这是我看了答案之后写的代码

#include
#include
#include
#include
#define maxn 10010
double a[maxn],pi=acos(-1.0);
using namespace std;
int main()
{
 double n,f,r=0,l=0;
 int o;
 cin>>n>>f; f++;
 for(int i=0;i<n;i++)
 {
  cin>>a[i];
  a[i]=a[i]*a[i]*pi; 
  r=max(r,a[i]);
 }
 while(l+0.000001<r)
 {
  o=0;
  double mid=(r+l)/2;
  for(int i=0;i<n;i++) o+=a[i]/mid;
  if(o>=f) l=mid;
  else r=mid; 
 }
 cout<<fixed<<setprecision(3)<<l;
 return 0;
}

这是二分的一种用法(用来分(派)(电线)…)找到刚好够分和(派)的量最多的时候
二分
从最大(派)mid体积开始分对每个派做除法(意义:若除最大派外的派大于mid则可以记o+1或更多,小于的就记零)如果o>人数缩小mid如果小于就扩大mid
当l和r足够接近时表明此时mid达到最大输出l(这里有点难懂)因为while循环的终止条件是l+0.000001 (我交了三次分别为l,r,mid)都给过了

你可能感兴趣的:(笔记,二分)