本人的第二次发文,想记录下自己刷过的题目,目前还在初级阶段,慢慢进步就好,干吧得!
题目描述:
上图为泥土烧制出的瓷片项链,其中瓷片的直径为D,泥土的体积为V,并满足以下关系
其中V0为烧制每一片的损耗单位与V相同。当用料小于等于时,不能烧制成瓷片。例:V总=10,V0=1,若烧制成一片瓷片,V=V总=10,D=0.9.如果把泥土均分成2份,每份泥土的体积为V=V总/2=5,单个此片的直径D’=0.3*(5-1)^1/2=0.6,串起来的总长为1.2。
给定了泥土的总体积和烧制单个瓷片的损耗,烧制的瓷片数不同,能够得到的项链总长度也不相同,请计算烧制多少个瓷片能使所得到的项链最长。
输入:泥土总体积V,单个瓷片的损耗
输出:该整数为能获得最长项链而烧制的瓷片数。如果不能烧制成瓷片或者最优解不唯一(存在两个或者两个以上方案均能获得最长项链),输出0
问题分析:
由题目,可知要求我们给出泥土制成最长项链的最优解。
分成三种情况考虑:
1、V<V0 输出0
2、最大值出现两遍及以上 输出0
3、存在唯一最优解 直接输出找到的最大值对应的瓷片数
第一种直接利用条件判断,第二种与第三种情况合在一起,不过第二种情况要再便利一回,看最大值对应的分解情况是否超过一种,以此来区分第三种情况。
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int p = 0,flag = 0;
double vs,vi,len,max = -1;
cin >> vs >> vi;
if(vs < vi)
{
cout << 0 << endl;
return 0;
}
for(int i = 1; vs > vi*i; i++)
{
len = 0.3*sqrt(vs/i-vi)*i;
if(max < len)
{
max = len;
p = i;
}
}
for(int i = 1; vs > vi*i; i++)
{
if(max == 0.3*sqrt(vs/i-vi)*i)
flag++;
}
if(flag >= 2)
cout << 0 << endl;
else
cout << p << endl;
return 0;
}