題目網址

解題說明:

這一題是要找每個人可以分到的最大塊的派,且一塊派不能由不同的派組成的。所以我們可以使用二分搜來找出要的答案

範例code:

#include <bits/stdc++.h>
using namespace std;
const double pi = acos(-1.0);
const int INF = 10000+10;
double area[INF];
double max_area;
int n,f;
void init(){
  max_area = -INF;
}
bool bin(double test_area){
  int sum = 0;
  for(int i=0; i<n; i++){
    sum += floor(area[i]/test_area);
  }
  // 主人也要算進來
  return sum >= f+1;
}
void sol(){
  double tmp;
  cin>>n>>f;
  for(int i=0; i<n; i++){
    cin>>tmp;
    area[i] = tmp * tmp * pi;
    max_area = max(max_area,area[i]);
  }
  double l,r,m;
  l = 0;
  r = max_area;
  // binary search
  while (r-l>1e-5) {
    m = l + (r-l)/2;
    if(bin(m)) l = m;
    else r = m;
  }
  cout<<fixed<<setprecision(4)<<m<<endl;
}
int main(int argc, char const *argv[]) {
  int nc;
  cin>>nc;
  while (nc--) {
    init();
    sol();
  }
  return 0;
}