题目连接:http://codeforces.com/problemset/problem/913/C
题意:n个物品 ,第i个物品的体积是2^i-1 花费是ci 每种物品无限使用 问取物品总体积大于等于L时的最小花费。
思路:
考虑:1.由于物品可以无限取,所以当两个第i-1个物品的花费小于第i个物品的花费时,显然前者是更优的策略;
2.物品的体积是基于2^i-1变化的,所以考虑将L转成2进制
3.对于L的二进制来讲,当某一位是1时,直接取此体积所对应的最优取法;当某一位是0时,则代表取了这一位所对应的体积之后,这个体积是一定大于之前所取的体积之和的,这时要比较是之前的方案和现在的方案那个花费更少
注意int范围 用longlong
代码:
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll c[1000],dp[1000],b[1000];
int main() {
int n,l;
cin >> n >> l;
for (int i = 0; i < n; i++) cin >> c[i];
dp[0] = c[0];
int i = 1, j = 0;
for (i; i < n; i++) dp[i] = min(c[i],dp[i-1]<<1);
for (i; i <= 30; i++) dp[i] = dp[i-1] << 1;
while (l) {
b[j++] = l%2; l >>= 1;
}
ll sum = 0;
for (int k = 0; k <= 30; k++) {
if(b[k]) sum+=dp[k];
else sum = min(sum,dp[k]);
}
cout << sum << '\n';
return 0;
}