首页 > 其他分享 >题解:CF916B Jamie and Binary Sequence (changed after round)

题解:CF916B Jamie and Binary Sequence (changed after round)

时间:2024-08-30 20:37:21浏览次数:9  
标签:Binary 元素 题解 Jamie 最小 max 序列 拆掉 字典

题意

把一个数分解成恰好 \(k\) 个 \(2^{a_i}\) 次方的和,可以重复,要求保证最大的 \(a_i\) 要尽可能的小时,\(a\) 的字典序尽可能大,输出序列 \(a\)。

分析

首先我们借助二进制拆出一个满足 \(n=\sum 2^{a_i}\) 序列 \(a\),满足 \(a\) 的长度最小。

若此时 \(a\) 的长度大于 \(k\),显然无解。

因为 \(2^m=2^{m-1}+2^{m-1}\),我们每次取出序列中最大的元素 \(a_i\),然后向序列中加入两个 \(a_i-1\) 直到序列的长度等于 \(k\)。

因为我们每次拆出的元素均为序列中的最大值,显然能保证此时 \(\max a_i\) 是最小的。

模拟上述过程,然后得到 WA on #5。


当 \(k=5\),而某一步得到的 \(a=\{4, 4, 2, 1\}\) 这种情况就能 hack 掉这种做法。

因为此时拆掉最大元素 \(4\) 得到的序列 \(a=\{4,3,3,2,1\}\) 的字典序小于拆掉最小元素 \(1\) 得到的序列 \(a=\{4, 4, 2, 0, 0\}\)。

发现如果当前的 \(\max a_i\) 等于答案中的 \(\max a_i\) 时,拆掉最小元素的方案会使字典序大于拆掉最小元素的方案。

使用 set 模拟即可。

AC 记录

Code

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

multiset<int, greater<int>> s, s0;

int main()
{
    int64_t n, k;
    cin>>n>>k;
    for(int i=0;i<63;i++) 
        if(n&(1ll<<i)) s.emplace(i);  
    if(s.size()>k) return cout<<"No", 0;
    cout<<"Yes\n";
    s0=s;
    while(s.size()<k)
    {
        int p=*s.begin();
        s.erase(s.begin());
        s.emplace(p-1);
        s.emplace(p-1);
    }
    int mx=*s.begin();
    while(s0.size()<k)
    {
        int p=*s0.begin();
        if(p==mx) break;
        s0.erase(s0.begin());
        s0.emplace(p-1);
        s0.emplace(p-1);
    }
    while(s0.size()<k)
    {
        int p=*s0.rbegin();
        s0.erase(prev(s0.end()));
        s0.emplace(p-1);
        s0.emplace(p-1);
    }
    for(auto i:s0) cout<<i<<' ';
}

标签:Binary,元素,题解,Jamie,最小,max,序列,拆掉,字典
From: https://www.cnblogs.com/redacted-area/p/18389458

相关文章

  • 题解:CF914C Travelling Salesman and Special Numbers
    题意定义\(\operatorname{popcount}(x)\)为\(x\)二进制下\(1\)的个数。定义对\(x\)的一次操作:\(x\gets\operatorname{popcount}(x)\),显然任意正整数经过若干次操作后会变为\(1\)。给定\(n\)和\(k\),其中\(n\)是在二进制下被给出,求出所有不大于\(n\)且将其变为......
  • 题解:CF915G Coprime Arrays
    题意我们称一个大小为\(n\)的数组\(a\)互质,当且仅当\(\gcd(a_1,a_2,\cdots,a_n)=1\)。给定\(n,k\),对于每个\(i\)\((1\lei\lek)\),你都需要确定这样的数组的个数——长度为\(n\)的互质数组\(a\),满足对每个\(j\)\((1\lej\len)\),都有\(1\lea_j\lei\)。分析......
  • [COCI2012-2013#2] INFORMACIJE 题解
    前言题目链接:洛谷。题意简述你需要构造一个\(1\simn\)的排列\(a\),满足\(m\)个条件,格式如下:1xyv:\(\max\limits_{i=l}^ra_i=v\)。2xyv:\(\min\limits_{i=l}^ra_i=v\)。题目分析首先这个最值很难受,考虑能不能转化成我们喜欢的二元关系......
  • Luogu P10997 Partition 题解 [ 蓝 ] [ 轮廓 dp ]
    Partition:一道dp神题,用到了以轮廓线的轨迹来做dp的技巧,和敲砖块这题的状态设计有点相似。观察首先观察样例,发现整张图可以看作是被两条线分隔开的。同时每个颜色的四个方向上又存在一大堆奇怪的性质,很容易发现这两条线一条是从左上到右下的线,另一条是从右下到左上的线。暴......
  • CF603E 题解
    题意给定一个\(n\)个结点的无向图,初始没有边。接下来有\(m\)个询问,每次向图中加入一条连接\((u,v)\)权值为\(w\)的边。每次加边后,查询是否存在一个边集\(E\),满足当图中只有\(E\)中的边时,所有点的度数均为奇数。同时你还要最小化\(\max\limits_{(u,v,w)\inE}......
  • 【Mysql】mysql count主键字段很慢超时 执行计划Select tables optimized away ,最终调
     背景: mysql表 主键字段count,速度很慢,耗时将近30s   从执行计划可以看出:explainSELECTCOUNT(rule_id)ASdataCountFROM`sku_safe_stock_rule`;   原理分析:SelecttablesoptimizedawaySELECT操作已经优化到不能再优化了(MySQL根本没有遍历......
  • CF891E Lust 题解
    题目链接点击打开链接题目解法会不了\(egf\)/ll我们把贡献变成\(\prod\limits_{j\neqi}a_j=\prod\limits_{j=1}^na_j-\prod\limits_{j=1}^n(a_i-[i=j])\)即答案为一开始的乘积\(-\)\(k\)次操作之后所有数乘积的期望因为有顺序,所以用\(egf\)的形式表示最后乘积的期......
  • UVA12421 (Jiandan) Mua (I) - Lexical Analyzer题解
    没什么废话、超级珂爱的大模拟。本蒟蒻写了2h才过。其实就是按题意模拟即可,不需要什么高深的算法。本人就是错在了符号中的“=”,因为如果是连续的两个等于号,只能输出“==”,而不能输出“=”“==”,然后本人就卡在这个地方卡了1.5h。代码量也不大,主要是毒瘤细节模拟题。......
  • P6192 【模板】最小斯坦纳树 题解
    Description给定一个包含\(n\)个结点和\(m\)条带权边的无向连通图\(G=(V,E)\)。再给定包含\(k\)个结点的点集\(S\),选出\(G\)的子图\(G'=(V',E')\),使得:\(S\subseteqV'\);\(G'\)为连通图;\(E'\)中所有边的权值和最小。你只需要求出\(E'\)中所有边的权值......
  • BZOJ 4403序列统计题解
    缅怀zxc......