瓷片项链[luogu]

        本人的第二次发文,想记录下自己刷过的题目,目前还在初级阶段,慢慢进步就好,干吧得!

  题目描述:

                          

上图为泥土烧制出的瓷片项链,其中瓷片的直径为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,单个瓷片的损耗V_{0}

输出:该整数为能获得最长项链而烧制的瓷片数。如果不能烧制成瓷片或者最优解不唯一(存在两个或者两个以上方案均能获得最长项链),输出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;
 } 

              

                           

 

 

 

 

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值