首页 > 代码库 > 洛谷1577 1297切绳子(二分答案)
洛谷1577 1297切绳子(二分答案)
题目描述
Wonderland居民决定举行一届地区性程序设计大赛。仲裁委员会志愿负责这次赛事并且保证会组织一次有史以来最公正的比赛。为此,所有参赛者的电脑和网络中心会以星状网络连接,也就是说,对每个参赛者,组委会会用一根长度一定的网线将他的计算机与中心连接,使得他们到网络中心的距离相等。
为了买网线,组委会与当地的网络公司联系,要向他们购买一定数目的等长网线,这些网线要尽可能的长,使得组织者可以让选手们彼此远离。
于是公司指派管理网线事务的负责人解决此事。负责人清楚地知道仓库里每根网线的长度(精确到厘米:cm),他也可以将他们以厘米的精度切割——前提是他得知道切成多长。但是现在,这个长度他算不出来,于是他彻底迷茫了。
你要做的,就是帮助困惑的负责人。编一个程序求出为了得到一定数目的等长网线,每根网线最大的可能长度。
输入输出格式
输入格式:
输入文件的第一行由两个整数N和K组成,由一个空格间隔。N(1≤N≤10000)是仓库里光缆的数目,K(1≤K≤10000)是需要的网线数目。
接下来的N行每行只有一个实数,告诉你每根缆线的长度(单位:m)。这些网线至少长1m,最多不超过100km。
所有的长度精确到cm,且小数点后有且仅有两位。
输出格式:
把你求得的最大网线长度写进输出文件(单位:m)。长度要精确到cm,并且输出时小数点后要恰有两位。
如果无论如何也不可能切割出需要数目的网线(每根至少1cm长),那么就输出“0.00”(不包括引号)。
输入输出样例
输入样例#1:
4 118.027.434.575.39
输出样例#1:
2.00
精度真真真恶心!!
92分代码:
#include<iostream>#include<cstdio>#include<cmath>using namespace std;int n,m,cnt;double ans,tot,maxx,a[10010],b[10010];bool judge(double mid){ cnt=0; for(int i=1;i<=n;i++) a[i]=b[i]; for(int i=1;i<=n;i++) { if(a[i]>=mid) while(a[i]>=mid) { a[i]-=mid; cnt++; } } if(cnt<m) return false; else return true;}int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { cin>>a[i]; tot+=a[i]; b[i]=a[i]; maxx=max(maxx,a[i]); } double l=0.00000001,r=maxx; while(l<=r) { double mid=(l+r)/2.000000; if(judge(mid)) l=mid+0.000000001,ans=mid; else r=mid-0.000000001; } if(ans==0) { printf("0.00"); return 0; } else printf("%.2lf\n",floor(ans*100)/100); return 0;}
满分,转int二分...摘的题解
#include<iostream>#include<cstdio>#include<algorithm>using namespace std;long long k,n,i,t,a[20010],l,r,mid;double b,out;bool pan(long long x){ t=0; for (i=1;i<=n;i++) t+=a[i]/x; if (t>=k) return true; else return false;}int main(){ cin>>n>>k; for (i=1;i<=n;i++) scanf("%lf",&b),a[i]=b*100; l=0;r=1000000000; while (l<=r) { mid=(l+r+1)/2; if (l==r) break; if (pan(mid)) l=mid; else r=mid-1; } out=mid*1.00/100; printf("%.2lf",out); return 0;}
洛谷1577 1297切绳子(二分答案)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。