生活随笔
收集整理的這篇文章主要介紹了
Swimming Balls
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Swimming Balls
https://vjudge.net/contest/318752#problem/J
如果直接算,各種球的情況都不清楚,因為放一個球之后,水位的變化也會影響之前放入的球,不如,二分最終的水位高度,這樣每個球的貢獻就有了
#include <iostream>
#include <cstdio>
#include <queue>
#include <algorithm>
#include <cmath>
#include <cstring>
#define inf 2147483647
#define N 1000010
#define p(a) putchar(a)
#define For(i,a,b) for(int i=a;i<=b;++i)
//by war
//2019.8.16
using namespace std;
int T,n;
double L,x,y,mid,W,D,V,w[N],r[N],eps=1e-
10,ans,pai=
3.141592653589793;
void in(
int &
x){int y=
1;
char c=getchar();x=
0;while(c<
'0'||c>
'9'){
if(c==
'-')y=-
1;c=
getchar();}while(c<=
'9'&&c>=
'0'){ x=(x<<
1)+(x<<
3)+c-
'0';c=
getchar();}x*=
y;
}
void o(
int x){if(x<
0){p(
'-');x=-
x;}if(x>
9)o(x/
10);p(x%
10+
'0');
}double v(
double r){return 4.0000000/
3.00000000*pai*r*r*
r;
}double deal(
double h,
int i){return pai*(r[i]*r[i]*h-h*h*h/
3.0);
}double lj(
double x,
int i){if(x-r[i]>
eps)return v(r[i])/
2.0+deal(min(r[i],x-
r[i]),i);return v(r[i])/
2.0-deal(r[i]-
x,i);
}bool check(
double x){double t=
V;For(i,1,n){if(
1.0000000-w[i]>
eps)t+=min(v(r[i])*
w[i],lj(x,i));elset+=
lj(x,i);}if(t/W/L-x>
eps)return 1;return 0;
}
signed main(){in(T);while(T--
){in(n);cin>>W>>L>>D>>
V;if(V<
eps){puts("0.0000000000");continue;}For(i,1,n)cin>>r[i]>>
w[i];x=
0;y=D+
eps;while(y-x>
eps){mid=(x+y)/
2.0;if(check(mid))x=
mid;elsey=
mid;}printf("%.10f\n",mid);}return 0;
} ?
轉載于:https://www.cnblogs.com/war1111/p/11375679.html
總結
以上是生活随笔為你收集整理的Swimming Balls的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。