小苯的排列构造,小苯的01背包(easy),小苯的01背包(hard)

小苯的排列构造

题目描述

 

运行代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define N 1000050
int i,j,k,n,m,t,a[N],b[N],f[N],l[N];
bool v[N];
int main(){
	cin>>n;
	for(i=1;i<=n;i++)
        cin>>a[i];
	v[0]=1;
	for(i=1;i<=n;i++){
		if(a[i-1]%a[i])
        {
            cout<<-1;
            return 0;
        }		
		while(v[l[a[i]]])
            l[a[i]]+=a[i];
		v[l[a[i]]]=1;
        f[i]=l[a[i]];
	}
	for(i=1;i<=n;i++)
        cout<<f[i]<<' ';
}

代码思路

  1. 读取整数序列 a[1], a[2], ..., a[n]
  2. 遍历序列,对于每个 a[i],确保 a[i] 能够整除其前一个数 a[i-1](除了第一个数 a[1],因为它没有前一个数)。
  3. 使用一个数组 l 来存储每个数 x 的当前可能位置或标签。例如,l[x] 表示当前值为 x 的数应该被放置在哪个位置。
  4. 使用一个布尔数组 v 来标记哪些位置已经被使用了。
  5. 对于每个 a[i]:如果 a[i] 不能整除其前一个数(除了第一个数 a[1]),则输出 -1 并终止程序。否则,在 l[a[i]] 开始,向后查找第一个未被使用的位(即 v[l[a[i]]] 为 false 的位置)。将找到的位置标记为已使用(v[l[a[i]] + k*a[i]] = true,其中 k 是使得该位置未被使用的最小整数)。将 f[i] 设置为找到的位置 l[a[i]] + k*a[i]
  6. 输出所有的 f[i]

小苯的01背包(easy)

题目描述

 

运行代码

#include <iostream>
using namespace std;
const int N = 2e5+5;
int v[N],w[N];
int ans;
void solve()
{
    int n,k;
    cin>>n>>k;
    for(int i=0;i<n;i++)
        cin>>v[i]>>w[i];
    for(int i=30;i>=0;i--){
        int sum=ans|(1<<i);
        int v_sum=(1<<30)-1;
        for(int j=0;j<n;j++){
            if((w[j]&sum)==sum) 
                v_sum&=v[j];
        }
        if(v_sum<=k) ans=sum;
    }
    cout<<ans<<endl;
    return;
}
int main()
{
	int f= 1;
	while(f--)
        solve();
	return 0;
}

代码思路

  1. 输入处理:首先读取两个整数nk,表示物品数量和目标价值。然后读取每个物品的价值v[i]和属性w[i]

  2. 位运算优化的动态规划

    • 外层循环从30(即二进制最高位)降到0,这是因为假设属性的位数最多为30位(由(1<<30)-1暗示)。
    • 对于当前位i,计算当前最优解ans加上这一位后的值sum
    • 初始化v_sum(1<<30)-1,代表所有可能的属性集合。
    • 遍历所有物品,检查当前物品的属性集合w[j]是否包含sum的所有位(即w[j] & sum == sum),如果是,则将该物品的价值集合(视为一个二进制位集合)与v_sum进行按位与操作,这样可以逐步筛选出满足条件的最小价值集合。
    • 如果经过上述筛选后得到的v_sum小于等于目标价值k,说明加入这一位是可行的,更新当前最优解ans = sum
  3. 输出结果:最后输出得到的最大属性集合所对应的二进制值ans

  4. 主函数:主函数中通过一个变量f控制解决问题的次数,这里f=1意味着只解决一次问题,然后调用solve()函数执行上述逻辑。

小苯的01背包(hard)

题目描述

 

运行代码

#include <iostream>
using namespace std;
typedef long long ll;
const int N=2e5+5;
int read() {
    int x = 0, f = 1;
    char c = getchar();
    while(c < '0' || c > '9')
        f = (c == '-') ? -1 : 1, c = getchar();
    while(c >= '0' && c <= '9')
        x = x * 10 + c - 48, c = getchar();
    return f * x;
}
int a[N], v[N], w[N], b[N], n, k;
bool check(int x) {
    int tot = 0;
    for(int i = 1; i <= n; i++)
        if((x & w[i]) == x)
            b[++tot] = i;
    int c = (1 << 31) - 1;
    for(int i = 1; i <= tot; i++)
        c &= v[b[i]];
    if(c <= k)
        return 1;
    return 0;
}
signed main() {
    n = read(), k = read();
    for(int i = 1; i <= n; i++)
        v[i] = read(), w[i] = read();
    int ans = 0;
    for(int i = 30; i >= 0; i--) {
        if(check(ans | (1 << i)))
            ans |= 1 << i;
    }
    cout << ans;
}

代码思路

  1. 输入处理:

    • 使用read()函数自定义读取整数,支持负数,提高了输入效率。
    • 读取项目数量n和价值阈值k,以及每个项目的具体价值v[i]和属性w[i]
  2. check函数:

    • 输入一个整数x,表示当前考虑的属性集合。
    • 遍历所有项目,如果项目i的属性集合w[i]x的子集(即(x & w[i]) == x),则将该项目的索引存入数组b[]
    • 计算所有符合条件的项目价值集合的交集(通过按位与运算),并检查这个交集的值是否不大于k。如果满足条件,返回true;否则,返回false
  3. 主函数逻辑:

    • 初始化答案ans为0,表示当前考虑的最优属性集合。
    • 从最高位到最低位遍历(即从第30位到第0位),对于每一位:尝试将这一位置为1(即在当前最优解基础上增加这一位的属性),然后检查这一改变是否仍然满足总价值不超过k的条件,这通过调用check()函数完成。如果满足条件,就保留这一位的修改(即这一位在最终解中应为1);如果不满足,就尝试下一位。
    • 最终输出得到的属性集合的二进制表示ans

利用了位运算来高效地处理集合的合并与判断,通过逐位检查的方式构建出满足条件的最优属性集合,相比直接的暴力枚举或者传统动态规划方法,在处理大规模数据时能显著提高效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/659537.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Windows下PostgreSQL数据库的备份与恢复

文章目录 一、备份1.找到PostgreSQL的安装目录下的"bin"目录2.在windows的命令窗口里&#xff0c;使用pg_dump进行备份1.打开命令窗口2.使用pg_dump将数据库备份下来 二、恢复1.找到PostgreSQL的安装目录下的"bin"目录2.在windows的命令窗口里&#xff0c;…

GD32F103系列单片机片上FLASH和ARM介绍

本文章基于兆易创新GD32 MCU所提供的2.2.4版本库函数开发 后续项目主要在下面该专栏中发布&#xff1a; 手把手教你嵌入式国产化_不及你的温柔的博客-CSDN博客 感兴趣的点个关注收藏一下吧! 电机驱动开发可以跳转&#xff1a; 手把手教你嵌入式国产化-实战项目-无刷电机驱动&am…

移动硬盘未格式化数据恢复及预防策略

随着数字化时代的到来&#xff0c;移动硬盘作为数据存储的重要载体&#xff0c;被广泛应用于个人和企业中。然而&#xff0c;当移动硬盘遭遇“未格式化”的困境时&#xff0c;其中的数据便岌岌可危。本文将深入探讨移动硬盘未格式化的现象、原因、数据恢复方案以及预防措施&…

男士内裤哪种款式舒服?五条实用技巧让你轻松挑选

对于很多男生来说&#xff0c;依然很难挑到真正舒适的内裤。比如卡臀卡裆&#xff0c;走路时不时还得提拉一下&#xff0c;真的很尴尬。又紧又闷的内裤&#xff01;尤其是炎热的夏天&#xff0c;黏糊糊的贼难受&#xff01;到底有没有一款舒适透气男士内裤呢&#xff1f;那今天…

C++之类(class)的三种成员修饰符(public、private、protected)总结

1、背景介绍 在C中&#xff0c;类&#xff08;class&#xff09;的三种访问修饰符&#xff08;access specifiers&#xff09;用于控制类的成员&#xff08;属性和方法&#xff09;的访问权限。这些修饰符决定了类成员在类的外部是否可以被访问。以下是这三种访问修饰符的详细…

端午节粽子龙舟主题互动趣味小游戏效果是什么

端午三天乐&#xff0c;无论节日当天还是之前&#xff0c;行业商家都可以自己的品牌为主借势营销&#xff0c;趣味活动形式玩法和内容呈现达成多种效果&#xff0c;品牌传播、公众号涨粉、线下互动、商品促销、用户促活等。 在【雨科】平台拥有多款端午节互动小游戏类型&#…

Ubuntu/Linux 安装Paraview

文章目录 0. 卸载已有ParaView1. 安装ParaView1.1 下载后安装 2.进入opt文件夹改名3. 更改启动项4. 创建硬链接5. 添加桌面启动方式6. 即可使用 0. 卸载已有ParaView YUT 1. 安装ParaView https://www.paraview.org/ 1.1 下载后安装 找到下载的文件夹&#xff0c;文件夹内…

SAP锁机制(SAP Locks)经验小结

1. 数据一致性与锁 为什么要有锁机制&#xff1f;其背后的核心逻辑在于“保证数据的一致性”。 当数据被应用程序修改时&#xff0c;我们必须要保证修改后的数据具有一致性。在SAP系统中&#xff0c;将一致的数据状态从一个状态变动到另一个一致状态的时间跨度被称为LUW&…

长文总结 | Python基础知识点,建议收藏

测试基础-Python篇 基础① 变量名命名规则 - 遵循PEP8原则 普通变量&#xff1a;max_value 全局变量&#xff1a;MAX_VALUE 内部变量&#xff1a;_local_var 和关键字重名&#xff1a;class_ 函数名&#xff1a;bar_function 类名&#xff1a;FooClass 布尔类型的变量名…

Matlab图像处理| 图像批量读取和存储、开闭运算

前言&#xff1a;因为matlab本身有很多数学公式库&#xff0c;图像处理有时候交给matlab会方便很多。另外&#xff0c;做科研就算不是专门写代码的也会了解些matlab&#xff0c;和做硬件的同门进行需求对接的时候往往也会要读matlab代码。所以觉得学习和自己相关matlab代码还是…

HTTPS单双向认证流程详解与联想

HTTPS单向认证 HTTPS在单向认证传输的过程中会涉及到三个密钥&#xff1a; 服务端的公钥和私钥&#xff0c;用来进行非对称加密交换密钥 客户端生成的随机密钥&#xff0c;用来进行对称加密传输数据 认证过程 1.客户端向服务器发起HTTPS请求&#xff0c;连接到服务器的443端…

margin-left: auto;使元素靠右

摘要&#xff1a; 今天写样式遇到一个东西&#xff0c;就是需要表单居右显示的&#xff0c;但是作用了弹性布局&#xff0c;其他的都不行的&#xff0c;一开始使用了浮动&#xff0c;但是使用了浮动后盒子就不继承父盒子的宽度了&#xff0c;移动端还行&#xff0c;自动回到100…

vue3 调用本地exe

1、注册表注册 在注册表中直接按照图2注册数据&#xff1b;也可以按照图3注册表的文件创建文档&#xff0c;然后点击打开&#xff0c;将会将注册表写入window系统。 图2 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\F1] "URL:F1 Protocol Handler" &q…

股价飙升:AI PC大变革,联想的“联想时刻”正在缔造?

按照产业的传导逻辑&#xff0c;在颠覆式技术到来之时&#xff0c;当引发这场变革的最核心技术及产品真正进入了产品化、商业化阶段&#xff0c;此时直触需求端的终端厂商&#xff0c;其成长性估算将得到市场的重新预估。 眼下AI PC之于联想就是如此。 5月27日&#xff0c;联…

装机数台,依旧还会心念i5-12600KF的性能和性价比优势:

近几个月的时间中&#xff0c; 装机差不多4台电脑&#xff0c;由于工作需要&#xff0c;计划年中再增添一台。 目前市场上英特尔CPU促销非常火爆&#xff0c;第12代、第13代以及第14代的产品在年中有适当的优惠。 年中也是装机的旺季&#xff0c;各种相关配件也相对便宜一些。…

03 Prometheus+Grafana可视化配置

03 PrometheusGrafana可视化配置 大家好&#xff0c;我是秋意零。接上篇Prometheus入门安装教程 grafana官网下载安装包比较慢&#xff0c;如果没有魔法。可关注公众号【秋意零】回复101获取 Grafana官网下载&#xff1a;https://grafana.com/grafana/download 这里采用的二进制…

521源码-免费源码下载-免费学习网站教程-宝塔面板ssl网站证书到期后弹出无法续期错误提示

宝塔面板如果从老版本升级到8.10后&#xff0c;当点站证书过期续期时会弹出错误&#xff1a; 排查文件是找不到问题出在哪里&#xff0c;导致续期错误。 解决办法&#xff1a;通过摸索&#xff0c;最简单的就是删除站点&#xff0c;注意&#xff1a;只是删除&#xff0c;不是把…

关于Word目录的更新

左侧标题顺序如有调整&#xff0c;自动目录并不会同步更新&#xff0c;每次都要记得在正文目录左上角点击更新目录

js监听鼠标mousemove时如何判断鼠标左键中键右键状态

首先添加鼠标移动监听 document.addEventListener(mousemove,function(e){ console.log(e.button,e.buttons,e.which); }) 1.只判断左键中键右键其中一个按键状态 e.which0&#xff1b;左键中键右键都没按下 e.which1&#xff1b;左键按下 e.which2&#xff1b;中键&am…

代码随想录算法训练营第四十三天 | 343. 整数拆分、96.不同的二叉搜索树

343. 整数拆分 代码随想录 视频讲解&#xff1a;动态规划&#xff0c;本题关键在于理解递推公式&#xff01;| LeetCode&#xff1a;343. 整数拆分_哔哩哔哩_bilibili 解题思路 1. dp[i]对i进行拆分&#xff0c;得到的最大的乘积为dp[i] 2.递推公式 一个是j * (i - j) 直接相…