题目大意:给你n个碗,求如何堆叠,使得它们的总高度最低。

首先,我们枚举碗的叠放顺序。

假设我们已经堆好了前i个碗,那么在堆第i+1个碗时,我们要将第i+1个碗与前i个碗比较,确定第i+1个碗的离地高度。

对于第i个碗和第j个碗的比较,我们分五种情况讨论(以下画图只画半个碗):

上方的碗底比下方的碗顶大,直接放上去即可

 上方的碗底比下方碗底小,直接放上去即可
 

 上方的碗边缘斜率小于下方的碗,且上方的碗比下方的碗大,的计算出其中一个碗的斜率,然后卡位即可
 

 情况和上图类似,也是直接卡位即可。
 

 上方的碗边缘斜率大于下方的碗,也是直接卡位。

具体的细节可以看我的代码。

然后请一定要仔细检查所有细节(我错了一个字母调了2h)

 #include<bits/stdc++.h>
#define M 10
using namespace std; struct node{
double a,b,c,d;
node(){a=b=c=d=;}
node(double aa,double bb,double cc,double dd){
a=aa; b=bb; c=cc; d=dd;
}
double xl(){return (d-b)/(c-a);}
friend double operator -(node a,node b){
double p=a.b; a.b-=p; a.d-=p;
//if(a.a>=b.a&&a.c>=b.c) return p;
if(a.c<=b.a) return p+a.d;
if(a.xl()>b.xl()){
if(b.c>=a.c){
double k=a.d-(a.c-b.a)*b.xl();
k=max(k,.);
return p+k;
}
double k=a.d-b.d-(a.c-b.c)*a.xl();
k=max(k,.);
return p+k;
}else{
if(b.a<=a.a) return p;
double k=a.d-(a.c-b.a)*a.xl();
k=max(k,.);
return p+k;
}
}
}a[M],s[M];
int n,p[M]={};
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++){
double x,y,z; cin>>x>>y>>z;
a[i]=node(y,,z,x);
}
for(int i=;i<=n;i++) p[i]=i;
double minn=1e10;
while(){
memset(s,,sizeof(s));
s[]=node(1e20,,1e21,);
for(int i=;i<=n;i++){
double maxn=;
for(int j=;j<i;j++)
maxn=max(maxn,s[j]-a[p[i]]);
s[i]=node(a[p[i]].a,maxn,a[p[i]].c,a[p[i]].d+maxn);
}
double maxn=;
for(int i=;i<=n;i++) maxn=max(maxn,s[i].d);
if(maxn<minn)
minn=min(minn,maxn);
if(!next_permutation(p+,p+n+)) break;
}
printf("%.0lf\n",minn);
}

最新文章

  1. js正则表达式校验非正整数:^((-\d+)|(0+))$
  2. Lucene教程
  3. Chrome/Firefox 中头toFixed方法四舍五入兼容性问题
  4. 看完《Thinking in Java》后,我觉得自己就是一个不懂编程的小孩子,如何快速摆脱这种自卑感
  5. Jquery异步请求简单实例(转)
  6. C++对象创建与释放
  7. PAT 1033. To Fill or Not to Fill (25)
  8. SQL的经典操作——批量复制同行的其它列数据到其它列数据
  9. ECMall的MySQL数据调用的简单方法
  10. ONVIF Event消息解析(How to work with gSoap)
  11. c/c++中与字符串处理相关的函数
  12. 一些公司对quantitative的要求
  13. 【44】java大数值剖析
  14. JS获取登录者IP和登录城市
  15. C# 反射Reflection Assembly
  16. css 文件连接不到网页
  17. leecode第十一题(盛最多水的容器)
  18. android 8 wifi 信号等级
  19. 16 Managing Undo
  20. 49 BOM 和DOM

热门文章

  1. OC调用Swift
  2. Kubernetes web界面kubernetes-dashboard安装
  3. simpson法计算arctan(1)-即pi/4
  4. Tomcat &amp; SVN
  5. java拷贝文件到另一个目录下
  6. windows下C++实现遍历本地文件
  7. java web前端easyui(layout+tree+双tabs)布局+树+2个选项卡tabs
  8. The Real Meaning of Peace
  9. 日期类的加减及java中所以日期类的操作算法大全
  10. AndroidPn消息推送