首页 > 代码库 > 第三章 poj 1064
第三章 poj 1064
#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左右吧。
第三章 poj 1064
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。