小P的强力值

来源: http://hihocoder.com/problemset/problem/1358


关键思路:

每次选取使得(1+1/x)^a 最大的第x类属性, 提高该属性可使目标函数在当前的基准下增大的最快。感觉与梯度下降法有些相似之处,在目标函数为凸函数时这种方式求得的局部最优解也是全局最优的。

另外需要注意大数输出时的精度问题


具体实现:

#include 
   
   
    
    
#include 
    
    
     
     
#include 
     
     
      
      
using namespace std;

#define SIZE 10
#define eps 1e-6
int N, K, a[SIZE], b[SIZE];

void init()
{
	cin >> N >> K;
	for (int i = 0; i < K; ++i)
		cin >> a[i];
	for (int i = 0; i < K; ++i)
		cin >> b[i];
}

void solve()
{
	double mx, tmp;
	int idx;
	for (int i = 0; i < N; ++i)
	{
		mx = 0; idx = -1;
		for (int j = 0; j < K; ++j)
		{
			tmp = pow(1 + 1.0 / a[j], 1.0 / b[j]);
			if (tmp - mx > eps)
			{
				mx = tmp;
				idx = j;
			}
		}
		++a[idx];
	}
	long double ans = 1.0;
	for (int i = 0; i < K; ++i)
		ans *= pow(a[i], 1.0 / b[i]);
	cout << fixed << setprecision(4) << ans << endl;
}

int main()
{
	init();
	solve();
	return 0;
}

     
     
    
    
   
   



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值