首页 > 其他分享 >题解:CF913C Party Lemonade

题解:CF913C Party Lemonade

时间:2024-09-09 21:17:17浏览次数:11  
标签:right return int 题解 Lemonade ret 瓶子 dfrac Party

分析

因为容量为 \(2^{i-1}\),所以对于任意的 \(i<j\),第 \(j\) 种瓶子一定可以通过选择 \(2^{j-i}\) 个 \(i\) 种瓶子来实现。

定义一个瓶子的性价比为 \(\dfrac{\textrm{容量}}{\textrm{价格}}\),即 \(\dfrac{2^{i-1}}{c_i}\)。

我们可以按照每个瓶子的性价比从高到低排序,依次选择。

选择时分两种情况:

  • 直接选择 \(\left\lceil\dfrac{L}{2^{i-1}}\right\rceil\) 个当前瓶子。

  • 选择 \(\left\lfloor\dfrac{L}{2^{i-1}}\right\rfloor\) 个当前瓶子,用后面的瓶子再去算剩下的 \(L-2^{i-1}\cdot\left\lfloor\dfrac{L}{2^{i-1}}\right\rfloor\) 容量。

两种情况取 \(\min\) 即可。

Code

#include<bits/stdc++.h>
using namespace std;

struct bot
{
    int V, w;
    bot(int v, int W): V(v), w(W) {}
    auto operator<=>(bot &b) {return 1ll*b.V*w<=>1ll*V*b.w;}
};

vector<bot> con, bts;

int64_t calc(int n, vector<bot>::iterator it)
{
    int64_t ret=ceil(1.00*n/it->V)*it->w;
    if(n%it->V==0||next(it)==bts.end()) return ret;
    else return min(ret, 1ll*(n/it->V)*it->w+calc(n%it->V, next(it)));
}

int main()
{
    int n, l;
    cin>>n>>l;
    for(int i=0, t;i<n;i++)
        cin>>t, con.emplace_back(1<<i, t);
    sort(con.begin(), con.end());
    for(auto v:con)
        if(bts.empty()||v.V<bts.back().V) 
            bts.emplace_back(v);
    cout<<calc(l, bts.begin());
}

标签:right,return,int,题解,Lemonade,ret,瓶子,dfrac,Party
From: https://www.cnblogs.com/redacted-area/p/18405334

相关文章

  • 题解:CF913D Too Easy Problems
    题意给定一场考试,考试会持续\(T\)毫秒,由\(n\)道题目组成,你可以用\(t_i\)毫秒解决第\(i\)个问题,每个问题给定一个整数\(a_i\)。要求你选出一个试题集合\(S\),若该集合大小为\(k\),它应满足\(T\geq\sum_{i\inS}\limitst_i\),你需要最大化\(\sum_{i\inS}\limits[a_i......
  • 题解:P5618 [SDOI2015] 道路修建
    题意给定一个\(2\timesN\)的网格,网格上的点和上下左右连边。要求支持以下几种操作:修改某条边的边权。求满足\(y\in[l,r]\)的点构成的点集的最小生成树。分析这道题的想法和P4246[SHOI2008]堵塞的交通很相似。注意到\(N,M\leq6\times10^4\),并且查询的是......
  • 题解:P6089 [JSOI2015] 非诚勿扰
    分析首先我们要求出对于第\(i\)位女性,她选择每个列表中的男性的概率是多少。第一轮选择第一位的概率为\(p\),选择第二位的概率为\(p(1-p)\),以此类推。显然第一轮选择第\(k\)位的概率为\(p(1-p)^{k-1}\)。假设列表中有\(n\)名男性,那么第二轮选择第一位的概率为\(p(1-p......
  • 题解:P3968 [TJOI2014] 电源插排
    题意维护一个\(01\)串,初始均为\(0\),支持:单点将\(1\)修改为\(0\)。查询区间中\(1\)的个数。查询最长且最靠右的连续\(0\)段的靠右的中点,并将其改为\(1\)。分析第一个操作和第二个操作显然使用动态开点线段树维护。我们只需要解决第三个操作。我们用平衡树存储......
  • CF1621G Weighted Increasing Subsequences 题解
    题目链接点击打开链接题目解法这种题就感觉每一步都不难想,但串在一起就不会显然考虑位置\(x\)作为\(lis\)的一部分,合法的\(lis\)的个数合法的约束是:令\(lis\)的最后一个位置为\(last\),满足\(\max\{a_{last+1},...,a_n\}>a_x\)不难发现,合法的\(last\)是一段区间......
  • 【最新华为OD机试E卷-支持在线评测】通过软盘拷贝文件(200分)多语言题解-(Python/C/Ja
    ......
  • P7230 题解
    P7230思路对每个左端点维护右端点\(res_i\)。操作形如删去一个数再加入一个数。如果删掉\(p\)上的\(a_p\),找到左右最近的\(l,r\)使得\(a_l=a_r=a_p\)。那么\(res_{l+1},\dotsb,res_p\)对\(r\)取max。实际上要维护\(\maxres_i-i+1\),因为\(res_i\)单调,所以相当于......
  • 【题解】Solution Set - NOIP2024集训Day25 概率期望 dp
    【题解】SolutionSet-NOIP2024集训Day25概率期望dphttps://www.becoder.com.cn/contest/5515「QOJ2606」Gachapon\(f_{i,j}\):用一次合法的level-irolling能够抽到的\(j\)的期望个数。\(h_{i,j,k}\):在\(i\)次操作之内,抽到恰好\(k\)个\(j\)的概率。\[h_{i,j,k......
  • luogu4198题解
    随机说话这个题做法没见过记一下。我一开始以为是李超树的题,结果把李超树打上之后就不会做了。然后题读错了写了一个弱化版。题目分析做法参考这个题题意只是假装是一个有关线段的题。简化之后的题意如下。有一个初始都为\(0\)的实数数列,每一次会修改位置\(x\)的数为......
  • Flutter 3.24 构建 release 抛出部分依赖 AAPT: error: resource android:attr/lStar
    问题截图:一些讨论:https://github.com/transistorsoft/flutter_background_fetch/issues/369问题原因及解决方案:@Aziz-T该问题与插件的compileSdkVersion和targetSdkVersion有关。出现该问题的原因是部分插件的compileSdkVersion和targetSdkVersion版本过旧。请前往......