【每日一题】BOWL 碗的叠放

[ZJOI2006]BOWL 碗的叠放

https://ac.nowcoder.com/acm/problem/20464

BOWL 碗的叠放

解题思路:
n只有9的大小,因此我们可以枚举碗的拜访顺序。接下来就是判断碗要怎么叠加
我们可以考虑碗的斜边斜率的关系
1)如果两者相等,要么可以放进去要不就不能放进去,
2)如果要放的小于已经放的,同样要放的底边可以放到已放的底边或者不能放到已放的底边,同样是两种情况
3)大于,同样是两种情况就不做图了,自己应该可以画出来

接着就是根据以上可以放的情况来算下底面的高度,找到最小值即可
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct no
{
	double h,r1,r2;
}bowl[10];
int id[15];
double temp[15];
double cal(int x,int y)
{
	if(bowl[x].r1>bowl[y].r2) 
	{
		return bowl[y].h;
	}
	if(bowl[x].r2<bowl[y].r1)
	{
		return 0;
	}
	if((bowl[x].r2-bowl[x].r1)*bowl[y].h<=(bowl[y].r2-bowl[y].r1)*bowl[x].h)
	{
	   if(bowl[x].r1<=bowl[y].r1) return 0;
	   return bowl[y].h*(bowl[x].r1-bowl[y].r1)/(bowl[y].r2-bowl[y].r1);	
	}	
	if(bowl[x].r2>bowl[y].r2)
	{
		return max(0.0,bowl[y].h-bowl[x].h*(bowl[y].r2-bowl[x].r1)/(bowl[x].r2-bowl[x].r1));
	}
	return max(0.0,bowl[y].h*(bowl[x].r2-bowl[y].r1)/(bowl[y].r2-bowl[y].r1)-bowl[x].h);
}
int main()
{
	
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>bowl[i].h>>bowl[i].r1>>bowl[i].r2;
		id[i]=i;
	}
	double ans = 0x3f3f,res=0;
	do
	{
		res=0;
		for(int i=1;i<=n;i++)
		{
			temp[i]=0;
			for(int j=1;j<i;j++)
			{
				temp[i]=max(temp[i],temp[j]+cal(id[i],id[j]));
			}
			res=max(temp[i]+bowl[id[i]].h,res);
		}
		ans=min(ans,res);
	}while(next_permutation(id+1,id+1+n));
	cout<<(int)(ans+0.5)<<endl;
	
 } 


全部评论

相关推荐

07-10 11:08
门头沟学院 Java
Sairus:我注册都注册不了提醒我手机号二次啥的,果然对于人才推得就是快,像我投完了就没回音的
投递京东等公司9个岗位
点赞 评论 收藏
分享
风中翠竹:真的真的真的没有kpi。。。面试官是没有任何kpi的,捞是真的想试试看这个行不行,碰碰运气,或者是面试官比较闲现在,没事捞个人看看。kpi算HR那边,但是只有你入职了,kpi才作数,面试是没有的。
双非有机会进大厂吗
点赞 评论 收藏
分享
Lorn的意义:你这种岗位在中国现在要么牛马天天加班,要么关系户进去好吃好喝,8年时间,真的天翻地覆了,对于资本来说你就说一头体力更好的牛马,哎,退伍没有包分配你真的亏了。
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-11 12:10
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务