[Codeforces 163D]Large Refrigerator (DFS+剪枝)

题面

已知一个长方体的体积为V,三边长a,b,c均为正整数,求长方体的最小表面积S

V以质因数分解的形式给出

分析

暴力做法很容易想到,按照质因子的指数枚举a,b,然后就能直接算出c,然后就可以得到表面积S=2(ab+bc+ac)

考虑优化:

1.搜索顺序:保证\(a \geq b \geq c\),枚举质因数时从大到小枚举a,从小到大枚举b

2.可行性剪枝:枚举a的时候保证\(a^3 \leq V\),枚举b时保证\(ab^2 \leq V\)

3.最优化剪枝:发现\(S=2(ab+bc+ac)=2a(b+c)+2bc\),又因为\(bc=\frac{V}{a}\),\(S=2a(b+c)+\frac{2V}{a}\)。根据基本不等式有\(b+c \geq 2 \sqrt{bc}=2\sqrt{\frac{V}{a}}\).所以枚举a的时候判断若\(\frac{2V}{a}+4a\sqrt{\frac{V}{a}}\)比当前答案大,就不要再继续搜索b了

4.常数优化:快读快写,预处理质因数的i次方

5.易错点:a,b,c的乘积可能会爆long long,要转成double再判断

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 100
#define rg register
#define INF 0x3f3f3f3f3f3f3f3f
using namespace std;
typedef long long ll;
inline void qread(int &x) {
x=0;
int sign=1;
char c=getchar();
while(c<'0'||c>'9') {
if(c=='-') sign=-1;
c=getchar();
}
while(c>='0'&&c<='9') {
x=x*10+c-'0';
c=getchar();
}
x=x*sign;
}
inline void qprint(int x) {
if(x<0) {
putchar('-');
qprint(-x);
} else if(x==0) {
putchar('0');
return;
} else {
if(x/10>0) qprint(x/10);
putchar(x%10+'0');
}
}
inline void qread(ll &x) {
x=0;
int sign=1;
char c=getchar();
while(c<'0'||c>'9') {
if(c=='-') sign=-1;
c=getchar();
}
while(c>='0'&&c<='9') {
x=x*10+c-'0';
c=getchar();
}
x=x*sign;
}
inline void qprint(ll x) {
if(x<0) {
putchar('-');
qprint(-x);
} else if(x==0) {
putchar('0');
return;
} else {
if(x/10>0) qprint(x/10);
putchar(x%10+'0');
}
}
inline ll fast_pow(ll x,ll k){
ll ans=1;
while(k){
if(k&1) ans=ans*x;
x=x*x;
k>>=1;
}
return ans;
} int t,n;
ll V;
ll p[maxn+5];
ll k[maxn+5];
ll mpow[maxn+5][maxn+5];
ll ans=INF;
ll ansa,ansb,ansc;
ll maxa;
void dfsb(int deep,ll va,ll vb){
if((double)va*vb*vb>V) return;
if(deep>n){
ll vc=V/va/vb;
if(2*(va*vb+va*vc+vb*vc)<ans){
ans=2*(va*vb+va*vc+vb*vc);
ansa=va;
ansb=vb;
ansc=vc;
}
return;
}
for(rg int i=0;i<=k[deep];i++){
k[deep]-=i;
dfsb(deep+1,va,vb*mpow[deep][i]);
k[deep]+=i;
}
}
void dfsa(int deep,ll va){
if((double)va*va*va>V) return;
if(deep>n){
double mins=2.0*V/va+4.0*va*sqrt(1.0*V/va);
if(mins>1.0*ans) return; //最优化剪枝
//S=2(ab+bc+ac)=2a(b+c)+2V/a
//由基本不等式得b+c>=2sqrt(bc)
//S>=2a*2sqrt(V/a)+2V/a
dfsb(1,va,1);
return;
}
for(rg int i=k[deep];i>=0;i--){
k[deep]-=i;
dfsa(deep+1,va*mpow[deep][i]);
k[deep]+=i;
}
} int main(){
// freopen("1.in","r",stdin);
// freopen("1.out","w",stdout);
qread(t);
while(t--){
qread(n);
V=1;
for(int i=1;i<=n;i++){
qread(p[i]);
qread(k[i]);
// V*=fast_pow(p[i],k[i]);
}
for(int i=1;i<=n;i++){
mpow[i][0]=1;
for(int j=1;j<=k[i];j++){
mpow[i][j]=mpow[i][j-1]*p[i];
}
V*=mpow[i][k[i]];
}
ans=INF;
dfsa(1,1);
qprint(ans);
putchar(' ');
qprint(ansa);
putchar(' ');
qprint(ansb);
putchar(' ');
qprint(ansc);
putchar('\n');
}
}

[Codeforces 163D]Large Refrigerator (DFS+剪枝)的更多相关文章

  1. Codeforces 293B Distinct Paths DFS+剪枝+状压

    目录 题面 题目链接 题意翻译 输入输出样例 输入样例#1 输出样例#1 输入样例#2 输出样例#2 输入样例#3 输出样例#3 输入样例#4 输出样例#4 说明 思路 AC代码 总结 题面 题目链接 ...

  2. codeforces 615 B. Longtail Hedgehog (DFS + 剪枝)

    题目链接: codeforces 615 B. Longtail Hedgehog (DFS + 剪枝) 题目描述: 给定n个点m条无向边的图,设一条节点递增的链末尾节点为u,链上点的个数为P,则该链 ...

  3. *HDU1455 DFS剪枝

    Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  4. POJ 3009 DFS+剪枝

    POJ3009 DFS+剪枝 原题: Curling 2.0 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16280 Acce ...

  5. poj 1724:ROADS(DFS + 剪枝)

    ROADS Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10777   Accepted: 3961 Descriptio ...

  6. DFS(剪枝) POJ 1011 Sticks

    题目传送门 /* 题意:若干小木棍,是由多条相同长度的长木棍分割而成,问最小的原来长木棍的长度: DFS剪枝:剪枝搜索的好题!TLE好几次,终于剪枝完全! 剪枝主要在4和5:4 相同长度的木棍不再搜索 ...

  7. DFS+剪枝 HDOJ 5323 Solve this interesting problem

    题目传送门 /* 题意:告诉一个区间[L,R],问根节点的n是多少 DFS+剪枝:父亲节点有四种情况:[l, r + len],[l, r + len - 1],[l - len, r],[l - l ...

  8. HDU 5952 Counting Cliques 【DFS+剪枝】 (2016ACM/ICPC亚洲区沈阳站)

    Counting Cliques Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  9. HDU 5937 Equation 【DFS+剪枝】 (2016年中国大学生程序设计竞赛(杭州))

    Equation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

随机推荐

  1. centos7.4安装mysql

    yum -y install mysql mysql-server mysql-devel mysql-server报错:No package mysql-server available,另外两个没 ...

  2. 线程池ThreadPoolExecutor实现原理

    线程属于稀缺资源,对于线程的创建规则,引用<阿里巴巴 Java 手册>中的一条进行说明. 本篇从源码方面介绍ThreadPoolExecutor对象,并简要解析线程池工作原理. 首先Thr ...

  3. POJ 2104 区间第k大(主席树)

    题目链接:http://poj.org/problem?id=2104 题目大意:给定还有n个数的序列,m个操作,每个操作含有l,r,k,求区间[l,r]第k大 解题思路:线段树只能维护序列的最大值最 ...

  4. 【rabbitmq】解决SimpleAmqpClient创建连接时阻塞的问题

    https://blog.csdn.net/panxianzhan/article/details/50755409 https://blog.csdn.net/csm201314/article/d ...

  5. Final修饰的字段是否可以通过反射设置值

    案发现场 经常听说final修饰的字段是常量不能改变的他的值,但是以外发现 Integer.java源码中的字段“value”是final,但是可以通过反射改变他的值. public final cl ...

  6. 饿了么CTO张雪峰:允许90后的技术人员“浮躁“一点

    编者按:今年4月,饿了么正式加入了阿里新零售战队,进一步加速其在本地生活市场的扩张速度.在创业9年的时间中,饿了么在外卖领域经历了真正的“从0到1”,尤其是在外卖平台的技术升级方面,越过了一个又一个的 ...

  7. Django2 --- cookie

    1. 什么是cookie ?用途是什么? Cookies是一些存储在用户电脑上的小文件.它是被设计用来保存一些站点的用户数据,这样能够让服务器为这样的用户定制内容,后者页面代码能够获取到Cookie值 ...

  8. c# 如何更改 WebBrowser所加载的 HTML元素(隐藏滚动条),并按照修改后的来呈现

    如何更改 WebBrowser所加载的 HTML元素 方法1:在网页加载完毕后的事件里面添加代码,我这里只是修改网页不出现滚动条,因为滚动条我重写了. #region (private) 网页加载完成 ...

  9. BZOJ 1596: [Usaco2008 Jan]电话网络 树形DP

    挺经典的,细节需要特别注意一下 Code: #include<bits/stdc++.h> using namespace std; #define setIO(s) freopen(s& ...

  10. C#仿QQ皮肤-Label与ListBox 控件实现----寻求滚动条的解决方案

    大家还是先来看看效果吧 这次之所以一次写两个控件,其实主要是因为Label控件实在是太简单了没有必要放放一个文章里写,所以就一次性来了.Label控件我就不再多说了,我直接把代码贴一下吧因为就几行代码 ...