LA3635派
題意:
? ? ? 有F+1個人來分n個圓形派,每個人分到的必須是一個整塊的派,形狀無所謂,每個人分到的必須一樣多,給你每個派的半徑,問每個人能分到的最大派的面積是多少。
思路:
? ? ? 雖然不是求最小的最大或是最大的最小,但是這個題目依然可以用二分去做,我們枚舉每個人分到的最大面積,這樣就可以算出來這些派最多能夠滿足幾個人的要求,然后去判斷二分的方向,一開始eps寫的有點小,TLE了一次,后來改大點AC了。
#include<stdio.h>
#include<math.h>
#define N 10000 + 10
#define eps 0.000001
double PI = acos(-1.0);
double ps[N];
bool ok(int mid ,int n ,int m)
{
? ? ?int Sum = 0;
? ? ?for(int i = 1 ;i <= n ;i ++)
? ? ?{
? ? ? ? Sum += int(ps[i] / mid);
? ? ?}
? ? ?return Sum >= m;
}
? ? ? ??
? ? ? ? ? ? ?
int main ()
{
? ? int n ,m ,i;
? ? double r ,Max;
? ? while(~scanf("%d %d" ,&n ,&m))
? ? {
? ? ? ? Max = 0;
? ? ? ? for(i = 1 ;i <= n ;i ++)
? ? ? ? {
? ? ? ? ? ?scanf("%lf" ,&r);
? ? ? ? ? ?ps[i] = PI * r * r;
? ? ? ? ? ?if(Max < ps[i]) Max = ps[i];
? ? ? ? }
? ? ? ? double low ,mid ,up ,Ans = 0;
? ? ? ? low = 0 ,up = Max;
? ? ? ? while(up - low >= eps)
? ? ? ? {
? ? ? ? ? ? mid = (low + up) / 2;
? ? ? ? ? ? if(ok(mid ,n ,m + 1))
? ? ? ? ? ? Ans = low = mid;
? ? ? ? ? ? else up = mid;
? ? ? ? }
? ? ? ? printf("%.5lf\n" ,Ans);
? ? }
? ? return 0;
}
? ? ? ??
? ? ? ??
? ? ? ? ? ??
? ? ? ??
? ?
? ? ? ??
? ? ? ? ? ?
? ??
? ? ? 有F+1個人來分n個圓形派,每個人分到的必須是一個整塊的派,形狀無所謂,每個人分到的必須一樣多,給你每個派的半徑,問每個人能分到的最大派的面積是多少。
思路:
? ? ? 雖然不是求最小的最大或是最大的最小,但是這個題目依然可以用二分去做,我們枚舉每個人分到的最大面積,這樣就可以算出來這些派最多能夠滿足幾個人的要求,然后去判斷二分的方向,一開始eps寫的有點小,TLE了一次,后來改大點AC了。
#include<stdio.h>
#include<math.h>
#define N 10000 + 10
#define eps 0.000001
double PI = acos(-1.0);
double ps[N];
bool ok(int mid ,int n ,int m)
{
? ? ?int Sum = 0;
? ? ?for(int i = 1 ;i <= n ;i ++)
? ? ?{
? ? ? ? Sum += int(ps[i] / mid);
? ? ?}
? ? ?return Sum >= m;
}
? ? ? ??
? ? ? ? ? ? ?
int main ()
{
? ? int n ,m ,i;
? ? double r ,Max;
? ? while(~scanf("%d %d" ,&n ,&m))
? ? {
? ? ? ? Max = 0;
? ? ? ? for(i = 1 ;i <= n ;i ++)
? ? ? ? {
? ? ? ? ? ?scanf("%lf" ,&r);
? ? ? ? ? ?ps[i] = PI * r * r;
? ? ? ? ? ?if(Max < ps[i]) Max = ps[i];
? ? ? ? }
? ? ? ? double low ,mid ,up ,Ans = 0;
? ? ? ? low = 0 ,up = Max;
? ? ? ? while(up - low >= eps)
? ? ? ? {
? ? ? ? ? ? mid = (low + up) / 2;
? ? ? ? ? ? if(ok(mid ,n ,m + 1))
? ? ? ? ? ? Ans = low = mid;
? ? ? ? ? ? else up = mid;
? ? ? ? }
? ? ? ? printf("%.5lf\n" ,Ans);
? ? }
? ? return 0;
}
? ? ? ??
? ? ? ??
? ? ? ? ? ??
? ? ? ??
? ?
? ? ? ??
? ? ? ? ? ?
? ??
總結
- 上一篇: LA3602DNA序列
- 下一篇: LA3708墓地雕塑