这场很水,但是出题太慢了。。。怠惰啊。。。
C. Fly
http://codeforces.com/contest/1011/problem/C
题意:宇宙之旅,途经n个星球,起飞、降落都需要燃烧燃料,火箭为m,在星球i上起飞每消耗1t燃料可以驱动a[i]重量的火箭, 降落是b[i],求解完成本次旅行需携带的最少燃料量。(精确到1e-10,误差<1e-6)
思路:设旅途结束燃料恰好耗尽,则最终的火箭重量就是m,依此求解即可。
1.可以从重量m开始倒着加(n...1)。
2.设火箭本身重量(m)+燃料重量(x)总重量为1遍历求解得到一个“单位”最终重量即“火箭重量”ans,则由1/ans = (m + x)/m可以求解出x.
3.二分(因为B题是二分下意识这么写了,但这是最暴力无脑且易错的解法了,思维定势导致了化简为繁,最终因为对二分算法的不熟悉导致contest时间内没能AC。。。但是二分上下界窝似乎总是写不好啊。。。最后换了解法AC二分什么的也不想改了。。。非常怠惰。。。)
#include <bits/stdc++.h> using namespace std; const int N = 1000 + 5; int a[N], b[N]; int main() { int n, m; scanf("%d %d", &n, &m); double ans = 1;; for(int i = 0; i < n; i++) scanf("%d", &a[i]); for(int i = 0; i < n; i++) scanf("%d", &b[i]); b[n] = b[0]; for(int i = 0; i < n; i++){ ans -= ans / a[i]; ans -= ans / b[i + 1]; } ans = m / ans - m; if(ans <= 0.0) puts("-1"); else printf("%.10f ", ans); return 0; }
#include<bits/stdc++.h> using namespace std; int a[1005]; int b[1005]; int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF) { for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } for(int i=1;i<=n;i++) { scanf("%d",&b[i]); } swap(b[1],b[n]); double tmp=m; double x=0; double tx=0; bool flag=true; for(int i=n;i>=1;i--) { if(b[i]<=1) { flag=false; break; } tx=tmp/(b[i]-1); tmp+=tx; x+=tx; if(a[i]<=1) { flag=false; break; } tx=tmp/(a[i]-1); tmp=tx+tmp; x+=tx; } if(flag) printf("%lf ",x); else printf("-1 "); } return 0; }
#include<bits/stdc++.h> using namespace std; int n; double m; double a[1005],b[1005]; bool C(double mid) { if(mid<=0) return 0; for(int i=0;i<n-1;i++) { mid-=(m+mid)/a[i]; mid-=(m+mid)/b[i+1]; if(mid<=0) return 0; } mid-=(m+mid)/a[n-1]; if(mid<=0) return 0; mid-=(m+mid)/b[0]; return mid>=0; } int main() { while(~scanf("%d",&n)) { scanf("%lf",&m); for(int i=0;i<n;i++) scanf("%lf",&a[i]); for(int i=0;i<n;i++) scanf("%lf",&b[i]); double l=1,r=1e9+10,ans=0; int flag=0; for(int i=0;i<100;i++) { double mid=(l+r)/2; if(C(mid)) { r=mid; ans=mid; flag=1; } else l=mid; } if(!flag) puts("-1"); else printf("%.10lf ",ans); } return 0; }