zoukankan      html  css  js  c++  java
  • poj 1190 dfs

    呃,感觉题意不是很明白,“由于要在蛋糕上抹奶油,为尽可能节约经费,我们希望蛋糕外表面(最下一层的下底面除外)的面积Q最小。 ”其实题意是说:所有的外表面+最下层的圆面积。(蛋糕从上往下俯视....只有一个最大的园面)

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 #include <cmath>
     6 using namespace std;
     7 
     8 #define inf 999999999
     9 #define Min(x,y)(x>y?y:x)
    10 int n,m,ans;
    11 int minv[21],mins[21];//前i层最小值
    12 
    13 void dfs(int v,int s,int floor,int r,int h)
    14 {
    15     if(floor==0)
    16     {
    17         if(v==n && ans>s)
    18             ans=s;
    19         return ;
    20     }
    21     if(v+minv[floor]>n || s+mins[floor]>ans || 2*(n-v)/r+s>=ans)
    22         return ;//最小可能都大于所以退出,最后一个由(n-v)/r==r*h,s==2*r*h推出。smin=2*(n-v)/r;
    23     int i,j,hh;
    24     for(i=r-1;i>=floor;i--)//最小取floor,,因为接下来的floor层每层至少为1
    25     {
    26         if(floor==m)
    27             s=i*i;
    28         hh=Min(h-1,(n-v)/(i*i));
    29         for(j=hh;j>=floor;j--)
    30             dfs(v+i*i*j,s+2*i*j,floor-1,i,j);
    31     }
    32 }
    33 
    34 void init()
    35 {
    36     minv[0]=0;
    37     mins[0]=0;
    38     for(int i=1;i<=20;i++)
    39     {
    40         minv[i]=minv[i-1]+i*i*i;
    41         mins[i]=mins[i-1]+2*i*i;
    42     }
    43 }
    44 
    45 int main()
    46 {
    47     init();
    48     while(scanf("%d%d",&n,&m) != EOF)
    49     {
    50         ans=inf;
    51         dfs(0,0,m,n+1,n+1);
    52         if(ans==inf)
    53             puts("0");
    54         else
    55             printf("%d\n",ans);
    56 
    57     }
    58     return 0;
    59 }
  • 相关阅读:
    Asp.net MVC3 Routing study
    Sharepoint 站点页面错误问题
    vc2010 学习笔记1
    UML类成员的困惑
    河道二维水流模拟高精度算法研究
    朱庆:真三维GIS技术进展
    map
    SIGGRAPH 2010: 一场视觉盛宴[转]
    新网站开张,欢迎大家
    获取其它进程内EDIT BOX内容的一种方法
  • 原文地址:https://www.cnblogs.com/Missa/p/2709298.html
Copyright © 2011-2022 走看看