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

news2024/11/15 12:44:41

小苯的排列构造

题目描述

 

运行代码

#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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

apexcharts数据可视化之极坐标区域图

apexcharts数据可视化之极坐标区域图 有完整配套的Python后端代码。 本教程主要会介绍如下图形绘制方式&#xff1a; 基础极坐标区域图单色极坐标区域图 基础极坐标区域图 import ApexChart from react-apexcharts;export function BasicPolar() {// 数据序列const series…

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;文件夹内…

[JAVASE] String类 StringBuffer类 StringBuilder类

目录 一.String类 1.1 String字符串不可变的原因 1.2 字符串中的比较方法 1.2.1 equals 1.2.2 compareTo 与 compareToIgnoreCase 1.3 字符串中的查找方法 1.3.1 charAt 1.3.2 indexOf 与 lastIndexOf 1.4 字符串中的转换方法 1.4.1 valueOf 1.4.2 toUpperCase 与 to…

【PMP必考点】2024年PMP敏捷知识必考点-工件篇

PMP自2023年8月起启动了PMBOK第七版教材&#xff0c;考试内容的侧重点也发生了改变&#xff1a;大幅增加了敏捷相关的内容。以往考纲只有不到10%的敏捷管理的内容&#xff0c;新考纲的敏捷管理题目增加至50%。所以如果复习只用之前的题目是远远不够的&#xff0c;必须要多刷新考…

el-tabs中的下拉框被覆盖解决方法

解决方法&#xff1a; ::v-deep .el-tabs__content{// overflow:hidden 会导致 分页下拉框超出部分会被.el-tabs__content隐藏overflow: visible; }

JEPaaS 低代码平台 accessToTeanantInfo SQL注入漏洞复现

0x01 产品简介 JEPaaS低代码开发平台开源版 旨在帮助企业快速实现信息化和数字化转型。该平台基于可视化开发环境,让软件开发人员和业务用户通过直观的可视化界面来构建应用程序 ,而不是传统的编写代码方式。 用户可以在开发平台灵活各个图形化控件,以构建业务流程、逻辑和…

Linux基础学习笔记

目录 1、Linux安装 1.1 安装教程 1.2 Linux目录结构 2、Linux常用命令 2.1 ls 2.2 命令分类 2.3 目录处理命令 2.4 操作文件命令 2.5 查找文件命令 2.6 ln链接命令 2.7 进程相关命令 ​编辑3、配置网络 3.1 关闭windows防火墙 3.2 配置好虚拟机的局域网 3.3 配置…

[数据集][目标检测]红外兔子检测数据集VOC+YOLO格式96张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;96 标注数量(xml文件个数)&#xff1a;96 标注数量(txt文件个数)&#xff1a;96 标注类别数…

【Linux】常见命令:fping的介绍和用法举例

一、fping命令的安装 在终端中输入如下命令&#xff08;Ubuntu系统使用apt install&#xff0c;CentOS系统使用yum install&#xff09; sudo apt install fping安装效果&#xff08;截图&#xff09;&#xff1a; 二、fping命令的用法和选项 fping命令用于检测主机是否存在…

01 Nginx安装部署(系列篇)

一、安装部署 1、Nginx的发行版本 常用版本分为四大阵营&#xff1a; Nginx 开源版 | https://nginx.org/&#xff1a;赤裸裸的Web服务器、反向代理、负载均衡&#xff08;功能少&#xff0c;开发难度大&#xff09; Nginx Plus 商业版 | https://www.nginx.com/&#xff1a;…

当今世界三个最厉害的人物颜廷利:全球最受欢迎的点赞第一人

我们生活在一个历史的拐点&#xff0c;一个要求我们重新构思自我、解读世界以及预见未来的时代。在这个时代&#xff0c;那些能够洞悉社会发展的深层逻辑&#xff0c;并据此提出全新定义的人&#xff0c;将成为引领人类思维、塑造普遍价值观和主导全球发展议程的先锋。因此&…

python-合并排列数组 I

问题描述&#xff1a;合并两个按升序排列的整数数组a和b&#xff0c;形成一个新数组&#xff0c;新数组也要按升序排列。 问题示例&#xff1a;输入A[1],B[1],输出[1,1],返回合并后的数组。输入A[1,2,3,4],B[2,4,5,6],输出[1,2,2,3,4,4,5,6],返回合并所有元素后的数组。 完整代…

PyTorch张量索引用法速查

作为数据科学家或软件工程师&#xff0c;你可能经常处理大型数据集和复杂的数学运算&#xff0c;这些运算需要高效且可扩展的计算。PyTorch 是一个流行的开源机器学习库&#xff0c;它通过 GPU 加速提供快速灵活的张量计算。在本文中&#xff0c;我们将深入研究 PyTorch 张量索…

数字资产革命:Web3带来的新商业机会

随着区块链技术的不断发展和普及&#xff0c;数字资产正逐渐成为全球范围内的热门话题。作为区块链技术的重要应用之一&#xff0c;Web3正在带来一场数字资产的革命&#xff0c;为传统商业模式带来了全新的机遇和挑战。本文将深入探讨数字资产革命与Web3的关系&#xff0c;探索…

vue学习汇总

目录 一、vue基本语法 1.插值表达式 {{}} 2.显示数据(v-text)和(v-html) 3.事件处理(v-on) 4.循环遍历(v-for) 5.判断语法(v-if) 6.元素显示与隐藏(v-show) 7.动态设置属性(v-bind) 8.数据双向绑定(v-model) 9.计算属性 二、vue组件 1.使用组件的三个步骤 2.注册组…

Android manifest清单文件意外权限来源和合并规则

问题背景 当自写APP发现无缘无故多申请了多个权限,其中一个就是:android.permission.WAKE_LOCK. 一想就知道如果并非自己在APP main中引入的,那就是依赖的库清单文件导入进来的. 定位问题 定位手段 1.manifest-merger-buildVariant-report.txt 根据其内容可知, WAKE_LOCK 权…

Nuxt3 中使用 ESLint

# 快速安装 使用该命令安装的同时会给依赖、内置模块同时更新 npx nuxi module add eslint安装完毕后&#xff0c;nuxt.config.ts 文件 和 package.json 文件 会新增代码段&#xff1a; # nuxt.config.ts modules: ["nuxt/eslint" ] # package.json "devDep…

睿联技术对亚马逊既依赖又竞争:递表前大额分红,资金充裕又补流?

《港湾商业观察》施子夫 王璐 今年3月29日&#xff0c;冲刺创业板IPO的深圳市睿联技术股份有限公司&#xff08;以下简称&#xff0c;睿联技术&#xff09;提交了注册&#xff0c;不出意外的话&#xff0c;公司离挂牌上市已经近在咫尺。 然而&#xff0c;在目前资本市场尤其…

第二十三届中国科学家论坛盛大开幕,星医联董事长杨星荣获“十四五”科技创新先锋人物

2024年5月25-26日&#xff0c;第二十三届中国科学家论坛在北京召开&#xff0c;北京星医联科技有限公司&#xff08;以下简称“星医联”&#xff09;董事长杨星女士受邀出席并荣获“十四五科技创新先锋人物”称号。同时星医联专利“一种靶向协同降脂的纳米双药制备及应用”荣获…

pytorch深度学习-环境搭建-2

1.1下载cudnn,解压 1.2.找到本级cuda安装路径 1.3.刚才解压文件复制到cuda安装目录 2.1 安装pytouch conda install pytorch torchvision torchaudio pytorch-cuda12.1 -c pytorch -c nvidia