题目描述 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
分类标签 Tags 点此展开
题解:
看似送分的题,有些细节需要注意。不建议枚举保留最大值,因为精度误差不可避免,容易出问题。
- 总体积为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; }