zoukankan      html  css  js  c++  java
  • POJ 1190 生日蛋糕题解

    题目地址:http://poj.org/problem?id=1190

    一道很有趣的搜索题……主要是剪枝……

    我弄了5个剪枝:

    1.当前剩余层数>=上层半径,剪掉

    2.当前剩余层数>=上层高度,剪掉

    3.体积<1,剪掉

    4.体积<当前可能的最小体积(我用等差数列求和公式算的……也不知道对不对)

    5.神奇剪枝网上看的,当前(剩余体积*2)/上层半径+当前表面积总和>当前搜出的最优解,剪掉

    代码很简单,20行

     1 #include <iostream>
     2 #include <cmath>
     3 #include <climits>
     4 #define pow2(k) k*k
     5 #define v(r,h) pow2(r)*h
     6 #define min(a,b) a<b?a:b
     7 using namespace std;
     8 int n,m,s=INT_MAX,beg;
     9 void dfs(int r,int h,int c,int lv,int ans)
    10 {
    11     if(c>m){if(!lv)s=min(s,ans);return;}if(r<=m-c+1||h<=m-c+1||ans+lv*2/r>s||lv<1||lv<(m-c+2)*(m-c+1)/2)return;
    12     for(int i=r-1;i>0;i--)for(int j=1;j<h&&v(i,j)<=lv;j++)dfs(i,j,c+1,lv-v(i,j),ans+2*i*j);
    13 }
    14 int main()
    15 {
    16     ios::sync_with_stdio(0);
    17     cin>>n>>m,beg=sqrt(n)+1;
    18     for(int i=beg;i>=1;i--)for(int j=1;v(i,j)<=n;j++)dfs(i,j,2,n-v(i,j),pow2(i)+2*i*j);
    19     cout<<(s==INT_MAX?0:s);
    20     return 0;
    21 }
  • 相关阅读:
    P85 实战练习
    Java语句及控制台输入
    P62 实战练习
    运算符、数据类型转换和注释
    Java变量与常量
    Java语法初步实际应用
    JQ 练习题
    JQ 特效下拉列表 写出与css一样的效果
    JQ 全选设定与设置选中
    JQ JSON数据类型
  • 原文地址:https://www.cnblogs.com/rjgcs/p/6323399.html
Copyright © 2011-2022 走看看