标签:blog io os for div sp 代码 log on
#include <iostream> #include <cmath> #include <cstdio> using namespace std; const int maxn=10000; const double eps=0.00001; double Len[maxn]; int n,k; double Max; bool Right(double len) { int ans(0); for (int i=0;i<n;i++) { ans+=(int)(Len[i]/len); } if (ans>=k) return true; else return false; } bool Bigger(double a,double b) { if (a-b<=eps) return true; else return false; } void Init() { cin>>n>>k; for (int i=0;i<n;i++){ scanf("%lf",&Len[i]); Max=max(Max,Len[i]); } } int main() { // freopen("a.txt","r",stdin); Init(); double ln(0),rn(Max); for (int i=1;i<=100;i++) { double mid=(ln+rn)/2; if (Right(mid)) { ln=mid; } else { rn=mid; } } rn=(rn+ln)/2; printf("%.2f\n",floor(rn*100)/100); }
上面的代码和下面的代码仅仅在二分判断退出的地方不同,但是上面的却是WA,下面的AC。
#include <iostream> #include <cstdio> #include <string> #include <sstream> #include <cmath> using namespace std; const int maxn=10000; const double eps=0.001; double Len[maxn]; int n,k; double Max; bool Right(double len) { int ans(0); for (int i=0;i<n;i++) { ans+=(int)(Len[i]/len); } if (ans>=k) return true; else return false; } void Init() { cin>>n>>k; Max=0; for (int i=0;i<n;i++) { scanf("%lf",&Len[i]); Max=max(Max,Len[i]); } } int main() { //freopen("a.txt","r",stdin); Init(); double ln(0),rn(Max); for (int i=1;i<=100;i++) { double mid=(ln+rn)/2; if (Right(mid)) { ln=mid; } else { rn=mid; } } rn=(rn+ln)/2; printf("%.2f\n",floor(rn*100)/100); }
下面进行100次循环,每次二分,精度为lenmax>>100。
本例中N=10000,所以大概为1*e-27左右吧。
标签:blog io os for div sp 代码 log on
原文地址:http://www.cnblogs.com/dandi/p/3972213.html