洛谷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 11
8.02
7.43
4.57
5.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;
}
 
时间: 2024-12-17 05:49:22

洛谷1577 1297切绳子(二分答案)的相关文章

洛谷P1462 通往奥格瑞玛的道路 二分答案+最短路SPFA

洛谷P1462 通往奥格瑞玛的道路二分答案+最短路SPFA 二分交费最多的一次的钱数 然后只将符合要求的边加入图中 如果到终点的最短路大于等于血量 或者直接起点不能到达终点那么说明不符合要求 需要加大答案 时间复杂度 (log答案)* Ek 需要注意如果本来就不能到达 那么直接输出AFK 1 #include <bits/stdc++.h> 2 #define LL long long 3 #define For(i,j,k) for(int i=j;i<=k;i++) 4 using

洛谷P1462通往奥格瑞玛的道路——二分答案最短路

题目:https://www.luogu.org/problemnew/show/P1462 最大值最小问题,二分答案. 代码如下: #include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; int const MAXN=1e5+5; queue<int>q; int n,m,b,cost[MAXN],head[MAXN],

洛谷P1462 通往奥格瑞玛的道路[二分答案 spfa 离散化]

题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛 题目描述 在艾泽拉斯,有n个城市.编号为1,2,3,...,n. 城市之间有m条双向的公路,连接着两个城市,从某个城市到另一个城市,会遭到联盟的攻击,进而损失一定的血量. 没经过一个城市,都会被收取一定的过路费(包括起点和终点).路上并没有收费站. 假设1为暴风城,n为奥格瑞玛,而他的血量最多为b,出发时他的血量是满的.

洛谷 P1084 疫情控制 【二分+数据结构】

题目: H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都, 也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控制疫情,不让疫情扩散到边境 城市(叶子节点所表示的城市),决定动用军队在一些城市建立检查点,使得从首都到边境 城市的每一条路径上都至少有一个检查点,边境城市也可以建立检查点.但特别要注意的是, 首都是不能建立检查点的. 现在,在 H 国的一些城市中已经驻扎有军队,且一个城市可以驻扎多个军队.一支军队可以在有道路连接的城市

洛谷P1281 书的复制

洛谷P1281 书的复制二分 1 #include <bits/stdc++.h> 2 #define For(i,j,k) for(int i=j;i<=k;i++) 3 using namespace std ; 4 5 const int N = 511,M = 511 ; 6 int a[N],L[M],R[M] ; 7 int n,k,MAX,num ; 8 struct node{ 9 int l,r ; 10 }ans[N] ; 11 12 inline int read(

洛谷P1316 丢瓶盖 二分答案

洛谷P1316 丢瓶盖 二分答案 二分距离 判断能够取几个 1 #include <bits/stdc++.h> 2 #define For(i,j,k) for(int i=j;i<=k;i++) 3 using namespace std ; 4 5 const int N = 100011 ; 6 int n,k,mi,mx,mid,l,r ; 7 int last,sum ; 8 int pos[N] ; 9 10 inline int read() 11 { 12 int x

洛谷P1182 数列分段Section II 二分答案

洛谷P1182 数列分段Section II 二分答案 题意:将 n 个 数 分为 m段 求一种方案,使这m段中最大的和 最小 额..可能有点拗口,其实就是说每一种方案,都有对应的 每段和的最大值,要求一种方案,使最大值最小 题解 :二分答案 mid为分成的最大值, 然后O(n) 判断 答案 是否可行 贪心的做下去,如果再加上就要超过了,那就新开一段 最后判断开的段数是否小于 m 1.注意要判断 如果当前这个值大于 mid,一个值就已经大于 mid了,那就直接退出了,否则 ,这个值也只会单独算为

[NOIP提高&amp;洛谷P1024]一元三次方程求解 题解(二分答案)

[NOIP提高&洛谷P1024]一元三次方程求解 Description 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差的绝对值>=1.要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位. 提示:记方程f(x)=0,若存在2个数x1和x2,且x1<x2,f(x1)*f(x2)<0,则在(x1,x2)之间一定

[NOIP2015提高&amp;洛谷P2678]跳石头 题解(二分答案)

[NOIP2015提高&洛谷P2678]跳石头 Description 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之间,有 N 块岩石(不含起点和终 点的岩石).在比赛过程中,选手们将从起点出发,每一步跳向相邻的岩石,直至到达 终点. 为了提高比赛难度,组委会计划移走一些岩石,使得选手们在比赛过程中的最短跳 跃距离尽可能长.由于预算限制,组委会至多从起点和终点之间移走 M 块岩石(不能 移走起点和终点的岩石). 输入格式