cf Hello 2018 C. Party Lemonade

题目地址

题目大意:给出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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值