Codeforces Round #499(Div2) C. Fly (二分精度)
http://codeforces.com/contest/1011/problem/C 题目
这是一道大水题!
仅以此题解作为我这个蒟蒻掉分的见证
1 #include<iostream> 2 #include<cstdio> 3 #include <cctype> 4 #include<algorithm> 5 #include<cstring> 6 #include<cmath> 7 #include<string> 8 #include<cmath> 9 #include<set> 10 #include<vector> 11 #include<stack> 12 #include<queue> 13 #include<map> 14 using namespace std; 15 #define ll long long 16 #define mem(a,x) memset(a,x,sizeof(a)) 17 #define se second 18 #define fi first 19 const int INF= 0x3f3f3f3f; 20 const int N=1e7+5; 21 22 int n,m,a[1005],b[1005]; 23 24 bool check(double x) 25 { 26 double sum=m+x; 27 28 if(sum>m) 29 sum-= sum/a[1]; //从地球起飞 30 else return 0; 31 for(int i=2;i<=n;i++) //for循环里面都是在除地球外 各个星球上的降落起飞 32 { 33 if(sum>m) 34 sum-=sum/a[i]; 35 else return 0; 36 if(sum>m) 37 sum-=sum/b[i]; 38 else return 0; 39 } 40 if(sum>m) 41 sum-=sum/b[1]; //最后降落地球 42 else return 0; 43 44 if(sum>=m) return 1; //燃料 = sum-m 如果燃料>=0 表示可以 45 else return 0; 46 } 47 48 int main() 49 { 50 cin>>n>>m; 51 for(int i=1;i<=n;i++) scanf("%d",&a[i]); 52 for(int i=1;i<=n;i++) scanf("%d",&b[i]); 53 54 double l=0,r=1e9+10,mid,ans=-1; //r不能正好 1e9,不然有个mid=1e9的点过不去 55 int flag=0; 56 while(r-l>=1e-6) //1e-7会超时,而且题目也要求了1e-6就够了 57 { 58 mid=(l+r)/2.0; 59 if(check(mid)) 60 { 61 ans=mid; 62 r=mid; 63 flag=1; 64 } 65 else l=mid; 66 } 67 if(!flag)cout<<-1; 68 else printf("%.10f",ans); 69 }