zoukankan      html  css  js  c++  java
  • 切香肠 (浮点数 二分)

    描述
    窗外肉价飞涨,屋里灶台微响。便当店老板在沉思中苦恼:
    现在店里的存货还有n条特制香肠,长度分别为Li 。如果能从它们中切割出k条长度相同的香肠的话,就能应付突如其来的奇怪的订单
    你能帮这位老板计算一下这k条香肠每条最长能有多长吗?
    (答案保留小数点后两位,规定1单位长度的香肠最多可以切割成100份)

    输入
    第一行输入2个正整数n,k
    第2−(n+1)行每行输入一个实数L(1.0≤Li≤1.0 * 10^5)
    输出
    输出切出来的香肠的最大长度,结果保留两位小数
    样例
    输入复制
    4 11
    8.02
    7.43
    4.57
    5.39
    输出复制
    2.00
    提示
    数据规模

    对于10%10%的数据,0≤n≤10,1≤k≤100≤n≤10,1≤k≤10

    对于20%20%的数据,0≤n≤100,1≤k≤1000≤n≤100,1≤k≤100

    对于40%40%的数据,0≤n≤1000,1≤k≤10000≤n≤1000,1≤k≤1000

    对于100%100%的数据,0≤n≤10000,1≤k≤100000≤n≤10000,1≤k≤10000
    思路:典型的二分(洛谷有一道切绳子,和本题一模一样),本题要求保留两位小数,如果直接用double计算会造成误差,所以我们可以先将浮点数乘以100倍,以整数的形式储存、计算。最后输出结果时只需除以100,以浮点数的形式输出即可。
    代码:

    #include <stdio.h>
    double p;
    long long n,k,t,t1,a[100005],max,min,mid;
    int ok(long long x)
    {
    	t=0;
    	for(int i=0;i<n;i++)
    	{
    		t1=(a[i]/x);
            t+=t1;
    	}
    	if(t<k)	return 0;
    	return 1;
    }
    int main()
    {
    	scanf("%lld%lld",&n,&k);
    	for(int i=0;i<n;i++)
    	{
    		scanf("%lf",&p);
            a[i]=100*p;
    	}
    	min=1;
    	max=10000000;
    	while(min<max)
    	{
    		mid=(min+max)/2;
    		if(ok(mid))
    		{
    			min=mid+1;
    		}
    		else
    		{
    			max=mid;
    		}
    	}
    	printf("%.2lf",1.0*(min-1)/100);
    	return 0;
    }
    
  • 相关阅读:
    Linux下vi命令大全
    Ubuntu的cron日志在哪里?
    如何使用DNN中的Calendar控件
    对DNN的理解:
    “SQL Server does not allow remote connections”错误的解决
    如何去除Search Skin ojbect中的"web"和"site"选项按键
    DNN发邮件通知4.8.2有漏洞,最好升级到新版本
    模块开发中一点疑惑?
    经典ASP代码大集合
    漂亮button
  • 原文地址:https://www.cnblogs.com/fxzemmm/p/14847997.html
Copyright © 2011-2022 走看看