codeforces 163D

本文介绍了一个使用C++实现的复杂优化问题求解程序,通过递归深度优先搜索算法寻找最小化特定数学表达式的解决方案。该程序利用了动态规划的思想,并针对大规模数据进行了优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<bits/stdc++.h>
#define N 127
#define eps 1e-6
using namespace std;
typedef long long LL;
LL t,w[N];
int n,c[N];
long long v=1,s=3e18;
long long A,B,C;
long long alpha(long long a){return 2*sqrt(a)*sqrt(v)+v/a;}
void dfs2(int p,LL a,LL b){
	if((long double)b*b*a-eps>v) return;
	if(p==n){
		if(a*b+v/a+v/b<s) s=a*b+v/a+v/b,A=a,B=b,C=v/a/b;
		return;
	}
	long long cm=1,sav=c[p];
	for(int i=0;i<c[p];i++) cm*=w[p];
	for(int i=c[p];i>=1;i--){
		c[p]-=i;
		dfs2(p+1,a,b*cm);
		c[p]+=i;
		cm/=w[p];
	}
	dfs2(p+1,a,b);
}
void dfs(int p,LL a){
	if((long double)a*a*a-eps>v) return;
	if(p==n){
		if(alpha(a)<s) dfs2(0,a,1);
		return;
	}
	long long cm=1;
	for(int i=0;i<c[p];i++) cm*=w[p];
	for(int i=c[p];i>=1;i--){
		c[p]-=i;
		dfs(p+1,a*cm);
		c[p]+=i;
		cm/=w[p];
	}
	dfs(p+1,a);
}
int main(){
	scanf("%lld",&t);
	while(t--){
		v=1;s=3e18;
		scanf("%d",&n);
		for(int i=0;i<n;i++){
			scanf("%lld%d",&w[i],&c[i]);
			for(int j=0;j<c[i];j++) v*=w[i];
		}
		dfs(0,1);
		printf("%lld %lld %lld %lld\n",2*s,A,B,C);
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值