POJ-1190 生日蛋糕 NOI99

深搜+几个剪枝。

貌似搜索顺序也挺重要的。。。我不知是不是因为这个然后Tle了好久。。。

#include <cstdio>
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>

#define rep(i, l, r) for(int i=l; i<=r; i++)
#define down(i, l, r) for(int i=l; i>=r; i--)
#define maxn 23
#define MAX 1<<30

using namespace std;

int n, m, ans, minv[maxn], mins[maxn];

void Search(int v, int s, int l, int R, int H)
{
    if (!l)
    {
        if (v == n && s < ans)
            ans = s;
        return;
    }
    if (s+mins[l-1] >= ans || v+minv[l-1] > n || (n-v)*2 >= R*(ans-s)) return;
    down(r, R-1, l)
    {
        if (l == m) s = r*r;
        int tmp = min((n-v-minv[l-1])/(r*r), H-1);
        down(h, tmp, l) Search(v+r*r*h, s+2*r*h, l-1, r, h);
    }
}

int main()
{
    scanf("%d%d", &n, &m); ans = n+1;
    rep(i, 1, m) minv[i] = minv[i-1]+i*i*i;
    rep(i, 1, m) mins[i] = mins[i-1]+2*i*i;
    Search(0, 0, m, sqrt((double)(n-minv[m-1])/m)+1, (n-minv[m-1])/(m*m)+1);
    if (ans == n+1) ans = 0; printf("%d\n", ans);
    return 0;
}

时间: 2024-11-08 19:23:44

POJ-1190 生日蛋糕 NOI99的相关文章

POJ 1190 生日蛋糕

POJ 1190 生日蛋糕 dfs + 剪枝 Description: 要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri, 高度为Hi的圆柱.当i < M时,要求Ri > Ri+1且Hi > Hi+1. 由于要在蛋糕上抹奶油,为尽可能节约经费,我们希望蛋糕外表面(最下一层的下底面除外)的面积Q最小. 令Q = Sπ 请对给出的N和M,找出蛋糕的制作方案(适当的Ri和Hi的值),使S最小. (除Q外,以上所有

POJ 1190 生日蛋糕题解

题目地址:http://poj.org/problem?id=1190 一道很有趣的搜索题--主要是剪枝-- 我弄了5个剪枝: 1.当前剩余层数>=上层半径,剪掉 2.当前剩余层数>=上层高度,剪掉 3.体积<1,剪掉 4.体积<当前可能的最小体积(我用等差数列求和公式算的--也不知道对不对) 5.神奇剪枝网上看的,当前(剩余体积*2)/上层半径+当前表面积总和>当前搜出的最优解,剪掉 代码很简单,20行 1 #include <iostream> 2 #incl

POJ 1190 生日蛋糕 DFS

生日蛋糕 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 18225   Accepted: 6486 Description 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri, 高度为Hi的圆柱.当i < M时,要求Ri > Ri+1且Hi > Hi+1. 由于要在蛋糕上抹奶油,为尽可能

poj 1190 生日蛋糕 , 强剪枝

题意: 制作一个体积为Nπ(N<=10000)的M(M<=20)层生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri, 高度为Hi的圆柱. 当i < M时.要求Ri > Ri+1且Hi > Hi+1. 因为要在蛋糕上抹奶油.为尽可能节约经费.我们希望蛋糕外表面(最下一层的下底面除外)的面积Q最小. 令Q = Sπ 请编程对给出的N和M,找出蛋糕的制作方案(适当的Ri和Hi的值),使S最小. (除Q外,以上全部数据皆为正整数

POJ 1190 生日蛋糕 剪枝

Description 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri, 高度为Hi的圆柱.当i < M时,要求Ri > Ri+1且Hi > Hi+1. 由于要在蛋糕上抹奶油,为尽可能节约经费,我们希望蛋糕外表面(最下一层的下底面除外)的面积Q最小. 令Q = Sπ 请编程对给出的N和M,找出蛋糕的制作方案(适当的Ri和Hi的值),使S最小. (除Q外,以上所

POJ 1190 生日蛋糕(DFS)

生日蛋糕 Time Limit: 1000MSMemory Limit: 10000KB64bit IO Format: %I64d & %I64u Submit Status Description 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体.设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri, 高度为Hi的圆柱.当i < M时,要求Ri > Ri+1且Hi > Hi+1.由于要在蛋糕上抹奶油,为尽

poj 1190 DFS 不等式放缩进行剪枝

F - (例题)不等式放缩 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 1190 Description 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri, 高度为Hi的圆柱.当i < M时,要求Ri &

生日蛋糕 POJ - 1190

7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri, 高度为Hi的圆柱.当i < M时,要求Ri > Ri+1且Hi > Hi+1. 由于要在蛋糕上抹奶油,为尽可能节约经费,我们希望蛋糕外表面(最下一层的下底面除外)的面积Q最小. 令Q = Sπ 请编程对给出的N和M,找出蛋糕的制作方案(适当的Ri和Hi的值),使S最小.(除Q外,以上所有数据皆为正整数) Inp

【POJ - 1190】生日蛋糕 (dfs+剪枝)

-->生日蛋糕  Descriptions: 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri, 高度为Hi的圆柱.当i < M时,要求Ri > Ri+1且Hi > Hi+1. 由于要在蛋糕上抹奶油,为尽可能节约经费,我们希望蛋糕外表面(最下一层的下底面除外)的面积Q最小. 令Q = Sπ 请编程对给出的N和M,找出蛋糕的制作方案(适当的Ri和Hi的值),