题目大意:给出n个瓶子,每个瓶子能装2^(n-1)柠檬水,给出瓶子的价格,输出至少装L升柠檬水需要的瓶子价格
感想:这场比赛我并没有打,第二点跟同学讨论这个题,发现这个题有点意思
思路:这个题一看就是贪心,不过这个题贪心的有点新意
代码:
#include <iostream>
using namespace std;
typedef long long ll;
int N, L;
ll C[32];//正好买2^(i-1)升的瓶子对应的最小价钱
ll price(int l)
{
ll r = 0;
for (int i = 0; i < 31; i++)
{
if (l & (1<<i))//l的二进制形式代表是否需要对应的能装2^(i-1)升的瓶子
r += C[i];
}
return r;
}
int main()
{
cin >> N >> L;
cin >> C[0];//正好买一升需要的价钱,即最小价钱
for (int i = 1; i < N; i++)
{
cin >> C[i];
C[i] = min(C[i], 2*C[i-1]);//正好买2^(i-1)升需要的最少价钱
}
for (int i = N; i < 31; i++)
C[i] = 2*C[i-1];//例如正好买2^N升相当于买两次2^(i-1)升需要的最小价钱,以此类推
ll minc = 1000000000000000000LL;//初始化
do
{
minc = min(minc, price(L));//寻找买L升及以上的最小值
L += (L&-L);//L加上L的二进制,右数第一个1对应的十进制值
//cout<<L<<" "<<(L&-L)<<endl;
} while(L > 0);
cout <<minc << endl;
}