首页 > 其他分享 >题解:CF437B The Child and Set

题解:CF437B The Child and Set

时间:2024-09-26 18:02:06浏览次数:7  
标签:node Set int 题解 Child ans lowbit bit operatorname

CF437B The Child and Set 题解

这题目就一个问题。

啥是 \(\operatorname {lowbit}\)?

\(\operatorname {lowbit}(x)\) 是指 \(x\) 的二进制表示中最低位的 \(1\) 所表示的值。

例如 \((14)_{10} = (1110)_2\),其中最低位的 \(1\) 在第二位,表示 \((2)_{10}\),即 \(\operatorname {lowbit}(14) = 2\)。

接下来考虑如何选取。

一个贪心策略是按照 \(\operatorname {lowbit}\) 从大到小选取,如果当前的数的 \(\operatorname {lowbit}\) 小于剩余的 \(n\),那么就选到这个数,并让 \(n\) 减去当前数的 \(\operatorname {lowbit}\)。

显而易见这样取出来的总和最大。

如果取到最后还不能取完,那么就输出 -1

有点类似于倍增。

至于怎么求 \(\operatorname {lowbit}\),先人给我们找好了方法:

\[\operatorname {lowbit}(x) = x\; \& \;(-x) \]

这是利用计算机补码性质完成的,其中的符号 \(\&\) 代表按位与。

最终代码如下:

#include<bits/stdc++.h>
#define MAXM 100010
using namespace std;
struct node{
    int num, bit;
};
bool operator < (node a, node b){ return a.bit < b.bit; }
bool operator > (node a, node b){ return a.bit > b.bit; }
node a[MAXM];
int n, m;
vector<int> ans;
int main(){
    scanf("%d%d",&n,&m);
    for(int i = 1; i <= m; i++) a[i] = (node){i, i & (-i)};
    sort(a + 1, a + m + 1, greater<node>());
    for(int i = 1; i <= m && n >= 0; i++){
        if(n >= a[i].bit){
            n -= a[i].bit;
            ans.push_back(a[i].num);
        }
    }
    if(n != 0) printf("-1\n");
    else{
        printf("%ld\n",ans.size());
        for(int i = 0; i < ans.size(); i++) printf("%d ",ans[i]);
        printf("\n");
    }
    return 0;
}

标签:node,Set,int,题解,Child,ans,lowbit,bit,operatorname
From: https://www.cnblogs.com/NightTide/p/18434004

相关文章

  • 题解:P4288 [SHOI2014] 信号增幅仪
    很好一题目,使我的最小圆覆盖旋转。先假设\(p=1\)。这是最简单的情况。这个时候我们就得到了一个裸的最小圆覆盖。当\(p\not=1\),但是\(a=0\)的时候。圆就变成了对称轴与坐标轴平行的椭圆,运用高中知识仿射一下,又回到了最小圆覆盖。在一般的情况下,我们先通过坐标的旋转......
  • 《超级机器人大战30》缺少roboex32.dll启动遇阻怎么办?轻松应对《超级机器人大战30》ro
    当《超级机器人大战30》因缺少roboex32.dll文件而启动遇阻时,可以尝试以下几种解决方案来轻松应对这一问题:一、下载并替换缺失的DLL文件寻找可靠来源:首先,需要在互联网上找到可靠的roboex32.dll文件下载源。建议访问官方网站、微软官方下载中心或知名的软件下载站点,以确保下载......
  • AT_arc176_e [ARC176E] Max Vector 题解
    发现数据范围很小,考虑最小割。先对题面做一个转化:构造两个序列\(X=(X_1,X_2,\dots,X_N),Y=(Y_1,Y_2,\dots,Y_N)\)最小化\(\sumX_i+Y_i\),有\(M\)个限制,每个限制有一个序列\(A_1,A_2,\dots,A_n\),需要满足\(\foralli,X_i\geA_i\)或者\(\foralli,Y_i\geA_i\)。考虑怎......
  • 1. 两数之和题解
    题目描述[!NOTE]总结:找出整数数组中两数之后等于目标值的两个数,然后返回其下标给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素......
  • 「FJWC2020Day5-zzq」rng 题解
    题意简述一个长度为\(n\)的实数序列\(a_i\),其中\(a_i\)为\([l_i,r_i]\)中独立均匀随机选取的实数。你只能通过交换相邻两个数,使得\(a_i\)单调不降。你需要求出你最少操作次数的期望,对\(M=998244353\)取模。\(1\leqn\leq10^6\),\(0\leql_i\ltr_i\leq10^{1......
  • setup配置;ref与reactive
    setup配置Vue3中的setup函数接收两个参数,分别是props和context。1、props:值为对象,包含:组件外部传递过来。切组件内部声明接收了的属性。需要注意的是,Vue3中的props是只读的,即在setup函数中不能修改props的值。如果需要修改传递过来的数据,可以使用响应式对象或ref。2、......
  • 留学期间学业常见问题解决办法,包括不能毕业的状况
    留学期间学业常见问题解决办法,包括不能毕业的状况【国外留学期间,遇到考试挂科的情况,影响了毕业,该怎么办?】考试挂科是一个很常见的现象,而国外院校,因为每个学校的规定不同,有的学校学生有补考机会,但是有的学校如果学生考试挂科情况很严重,或许就没有补考的机会了。这都没关系,重要的是,你......
  • 题解:P10104 [GDKOI2023 提高组] 异或图
    \(\text{Link}\)本题属于集合划分容斥,更多关于集合划分容斥的信息可观看详细揭秘:集合划分容斥的容斥系数。题意给定一个\(n\)个点\(m\)条边的图以及一个长为\(n\)的序列\(a_{1\dotsn}\),有一常数\(C\),你需要求出有多少序列\(b_{1\dotsn}\)满足\(0\leb_i\lea_i\)......
  • 题解:P10198 Infinite Adventure P
    \(\text{Link}\)题意给定\(n\)个数组\(c_{i,0\dotst_i-1}\),其中\(t_i\)为\(2\)的幂。有\(q\)次询问,每次询问给出三个参数\(x,T,\Delta\),接下来会执行\(\Delta\)次\(x\getsc_{x,T\bmodt_x},T\getsT+1\),求出最终的\(x\)。\(n,\sumt\le10^5\),\(q\le5\time......
  • 题解:P10998 Tuple+
    \(\text{Link}\)有意思,记录一下。题意给出\(m\)个互不相同的无序三元组\((u,v,w)\),求有多少无序四元组\((a,b,c,d)\)使得三元组\((a,b,c),(a,b,d),(a,c,d),(b,c,d)\)均存在。\(m\le3\times10^5\)。Bonus:\(m\le2\times10^6\)。题解回忆无向图三元环计数的做法,使......