博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj1190 dfs剪枝
阅读量:5061 次
发布时间:2019-06-12

本文共 1490 字,大约阅读时间需要 4 分钟。

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外,以上所有数据皆为正整数) 

Input

有两行,第一行为N(N <= 10000),表示待制作的蛋糕的体积为Nπ;第二行为M(M <= 20),表示蛋糕的层数为M。

Output

仅一行,是一个正整数S(若无解则S = 0)。

Sample Input

1002

Sample Output

68

Hint

圆柱公式 
体积V = πR
2
侧面积A' = 2πRH 
底面积A = πR
2 

Source

代码如下:

//

//  17day6_I.cpp

//  acm

//

//  Created by sakumi on 19/02/2017.

//  Copyright © 2017 sakumi. All rights reserved.

//

 

#include <cstdio>

#include <cmath>

#include <algorithm>

using namespace std;

int min_volume[21];

int min_area[21];

int r[21];

int h[21];

int ans,n,m;

const int INF=0x3f3f3f3f;

void dfs(int r_limit,int h_limit,int volume,int area,int layer)

{

    if(layer==0){

        if(volume!=n)return;

        ans=min(ans,area);

        return;

    }

    if(area>ans-min_area[layer])return;

    if(n-volume<min_volume[layer])return;

    if(ans-area<=2*(n-volume)/r_limit)return ;

    for(int i=r_limit;i>=layer;i--){

        if(layer==m){

            area=i*i;

        }

        int max_h=(n-min_volume[layer-1]-volume)/(i*i);

        for(int j=min(max_h,h_limit);j>=layer;j--){

            dfs(i-1,j-1,volume+i*i*j,area+2*i*j,layer-1);

        }

    }

}

int main()

{

    while(scanf("%d",&n)!=EOF){

        scanf("%d",&m);

        min_area[0]=min_volume[0]=0;

        for(int i=1;i<=20;i++){

            min_area[i]=min_area[i-1]+2*i*i;

            min_volume[i]=min_volume[i-1]+i*i*i;

        }

        ans=INF;

        dfs((int)sqrt(n),n,0,0,m);

        printf("%d\n",ans);

    }

    return 0;

}

转载于:https://www.cnblogs.com/sakumia/p/6416841.html

你可能感兴趣的文章
mySQL 教程 第7章 存储过程和函数
查看>>
OGG同步Oracle到Kafka(Kafka Connect Handler)
查看>>
算法笔记_056:蓝桥杯练习 未名湖边的烦恼(Java)
查看>>
idea的maven项目无法引入junit
查看>>
jquery实现限制textarea输入字数
查看>>
thinkphp5 csv格式导入导出(多数据处理)
查看>>
页面置换算法-LRU(Least Recently Used)c++实现
查看>>
如何获取Android系统时间是24小时制还是12小时制
查看>>
fur168.com 改成5917电影
查看>>
PHP上传RAR压缩包并解压目录
查看>>
codeforces global round 1题解搬运
查看>>
python os模块
查看>>
Codeforces 719B Anatoly and Cockroaches
查看>>
jenkins常用插件汇总
查看>>
c# 泛型+反射
查看>>
第九章 前后查找
查看>>
Python学习资料
查看>>
多服务器操作利器 - Polysh
查看>>
[LeetCode] Candy
查看>>
Jmeter学习系列----3 配置元件之计数器
查看>>