1726 瓷片项链

1726 瓷片项链

 

2000年NOI全国竞赛

 时间限制: 2 s
 空间限制: 128000 KB
 题目等级 : 大师 Master
 
 
 
题目描述 Description

原始部落用一种稀有的泥土烧制直径相同的圆瓷片并串成项链,串的时候沿瓷片的直径方向顺次连接,瓷片之间没有空隙也不重叠,一条项链至少由一个瓷片构成。 

每个烧制的瓷片厚度是一定的,直径D和所用泥土的体积V有以下关系:

D = 0.3(V - V0)(V ≥ V0)

D = 0                  (V < V0)

其中 V0为烧制每一片的损耗,单位与 V 相同。当用料小于等于 V0时,不能烧制成瓷
片。 
例: V 总 = 10,V0 = 1,若烧制成一片瓷片,V = V 总= 10,D = 0.9。如果把泥土均分成 2 份,每份泥土的体积为 V = V 总/2 = 5,单个瓷片的直径为D' = 0.6 , 串起来的总长为 1.2。 给定了泥土的总体积和烧制单个瓷片的损耗,烧制的瓷片数不同,能够得到的项链总长度也不相同,请计算烧制多少个瓷片能使所得到的项链最长。

输入描述 Input Description

文件仅有两行,每一行仅包含一个整数和一个换行/回车符。第一行的数字为泥土总体积 V 总 (0<V 总<60000),第二行为烧制单个瓷片的损耗 V0(0< V0<600)。 

输出描述 Output Description

文件中仅包含一个数字和一个换行/回车符。该数字为能获得最长项链而烧制的瓷片数。 如果不能烧制成瓷片或者最优解不唯一(存在两个或者两个以上方案均能获得最长项链), 输出数字 0。 

样例输入 Sample Input

样例输入1:

10

1

样例输入2:

10

2

样例输出 Sample Output

样例输出1:

5

样例输出2:

0

数据范围及提示 Data Size & Hint
 

题解:

看似送分的题,有些细节需要注意。不建议枚举保留最大值,因为精度误差不可避免,容易出问题。

  • 总体积为Vt,每片损耗为V0,设烧制x片
  • 则每片体积 V=Vt/x 应满足V>V0 即x<Vt/V0
  • 直径 D=0.3 * sqrt(V-V0)
  • 总长度

    • L=x*D
  • =x 0.3 sqrt(Vt/x-V0)
  • =0.3 sqrt( Vt x - V0 * x^2 )

根号内部是一个二次函数,求其最值即可。当L取到最大值,有x=V/(2*V0)。

无解的条件是x的小数部分为0.5

AC代码:

#include<cstdio>
#include<cmath>
using namespace std;
int Vt,V0,ans;
double x,dx;
int main(){
    scanf("%d%d",&Vt,&V0);
    dx=floor(x=(double)Vt/V0/2);
    if(x-dx==0.5) ans=0;
    else ans=dx;
    printf("%d
",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/shenben/p/5765122.html