CSP历年复赛题-P1036 [NOIP2002 普及组] 选数

news/2024/9/8 8:55:18/文章来源:https://www.cnblogs.com/jcwy/p/18204741

原题链接:https://www.luogu.com.cn/problem/P1036

题意解读:题目即要在n个数中,枚举出所有的子集,当子集中数字个数刚好为k时,求和,判断是否是素数。

解题思路:

方法一:二进制法

通过二进制法,可以枚举一个集合中所有元素“选”或者“不选”的情况,用二进制1表示选该元素,二进制0表示不选。

下面对样例数据进行模拟:

如上图,从上到下依次枚举0~24-1对应的二进制,根据二进制位的0/1来决定对应元素“选”或“不选”,

k=3的即二进制位有3个1的情况用绿色标识,求和后是素数的用红色标识。

因此对于一般的n个数,只需要枚举0~2n-1,判断每个数的二进制中1的个数是否为k,再针对每个二进制位是0或1决定选或不选对应元素。

这里就引出两个重要的二进制操作:

1、统计二进制有多少个1

首先,介绍一个关键的操作:lowbit,可以返回一个数的二进制中最后一个1所表示的整数

例如x=6,即二进制0110,lowbit(6) = 2,实现如下:

int lowbit(int x)
{return x & -x;
}

要计算一个数的二进制中有多少个1,只需要每次都减去这个数的lowbit,直到0为止,统计次数:

int count1(int x)
{int cnt = 0;while(x){x -= lowbit(x);cnt++;}
}

2、二进制的某一位是0还是1

设整数i,要判断第j个(最低位j=0)二进制位是0还是1,只需要判断i >> j & 1是0还是1

100分代码-二进制法:

#include <bits/stdc++.h>
using namespace std;const int N = 25;int n, k, ans;
int a[N];//计算x的二进制中最后一个1所代表的整数,如11000回返回1000,也就是8
int lowbit(int x)
{return x & -x;
}//计算x的二进制中有多少个1
int count1(int x)
{int cnt = 0;while(x){x -= lowbit(x);cnt++;}return cnt;
}//判断x是否是素数
bool isprime(int x)
{if(x < 2) return false;for(int i = 2; i * i <= x; i++){if(x % i == 0) return false;}return true;
}int main()
{cin >> n >> k;int pow2n = 1;for(int i = 0; i < n; i++){cin >> a[i];pow2n *= 2; // 计算2^n } for(int i = 0; i < pow2n; i++){ if(count1(i) == k) //如果整数i的二进制中1的个数==k{int sum = 0;for(int j = 0; j < n; j++) //遍历二进制的每一位{if(i >> j & 1) sum += a[j]; //i >> j & 1表示将i右移j位再和1求&,即判断i的第j位二进制是否是1,注意j=0表示第一位}if(isprime(sum)) ans++;}}cout << ans; return 0;
}

方法二:DFS

n个数字,每个数字只有选或者不选两种情况,可以用一个数组保存选择的状态,1表示选,0表示不选,通过DFS来填充此数组即可。

100分代码-DFS:

#include <bits/stdc++.h>
using namespace std;const int N = 25;int n, k, ans;
int a[N];int tmp[N];//判断x是否是素数
bool isprime(int x)
{if(x < 2) return false;for(int i = 2; i * i <= x; i++){if(x % i == 0) return false;}return true;
}void dfs(int level)
{if(level > n) // 找到一组选择{//判断是否有k个1int cnt = 0;for(int i = 1; i <= n; i++){if(tmp[i] == 1) cnt++;}if(cnt != k) return;int sum = 0;for(int i = 1; i <= n; i++){if(tmp[i] == 1) sum += a[i];}if(isprime(sum)) ans++;return;}for(int i = 0; i <= 1; i++){tmp[level] = i;dfs(level + 1);}
}int main()
{cin >> n >> k;for(int i = 1; i <= n; i++) cin >> a[i];dfs(1);cout << ans;return 0;
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在使用Taro和TypeScript开发小程序, 使用抖音tt.pay报错找不到名称“tt”

在Taro中引入 抖音小程序 tt 和 微信小程序 wx的api. 会报错 解决办法: 在 src/globals.d.ts 文件中引入import "@douyin-microapp/typings"; import "@types/wechat-miniprogram";

Java框架集成ES

1、SpringData Elasticsearch框架集成 1.1、SpringData 框架基本介绍 Spring Data是一个用于简化数据库、非关系型数据库、索引库访问,并支持云服务的开源框架。其主要目标是使得对数据的访问变得方便快捷,并支持 map-reduce框架和云计算数据服务。Spring Data可以极大的简化…

weblogic漏洞浅谈

weblogic反序列化漏洞原理分析 weblogic是oracle公司出品的application server,用于本地和云端开发,集成,部署和大型分布式web应用,网络应用和数据库应用的Java应用服务器 weblogic server是一个基于JAVAEE架构的中间件,将java的动态功能和java Enterprise标准的安全性引入…

强化学习Q-learning算法——Python实现

Q-learning是一种基于值迭代的强化学习(Reinforcement Learning, RL)算法,主要用于在给定环境中学习一个策略,使得智能体(agent)能够在与环境交互的过程中获得最大累计奖励。它通过学习一个状态-动作值函数(Q函数)来指导智能体的行为选择,适用于各种离散状态和动作的任…

mysql: Syntax error or access violation: 1055 Expression #2 of SELECT (错误解决办法)

Mysql报错:SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column seo.ryc_combo_class_cate_list_113.fid which is not functionally dependent on columns in GROUP BY cla…

【APIM】Azure APIM抛出 java.lang.RuntimeException 错误定位

问题描述 Azure APIM服务日志中发现 java.lang.RuntimeException 错误,在进一步通过Application Insights采集的错误信息日志,发现真实的请求错误为:‘The remote name could not be resolved xxxx.xxx.xx"。问题解答 APIM服务,在没有配置自定义的DNS服务器时,默认会…

原型设计工具——Pixso

Pixso 定位于产品设计协作一体化工具,能一站式完成原型、设计、交互与交付,打通产品、设计到研发的工作链路,全面覆盖产品原型、UI/UX设计、原型交互、设计交付全流程,浏览器即开即用。 Pixso的核心特点快捷的图形绘制:Pixso内设有许多快捷键方便用户一键绘图,也可以导入…

三维坐标转2维坐标

最近在帮朋友调代码,他们想出份报告,需要把三维的坐标系以一定的角度画到纸面上。 公式:x = xCosα + zCosβ y = y - zSinβ + xCosα 以下是公式推导过程 1. 先画平面直角坐标系(xy坐标系)和空间直角坐标系(xyz坐标系,本文用x,y,z表示),x轴和x轴之间的夹角为α,…

Windows安装Docker Desktop找不到hyper-v(Windows11家庭中文版没有hyper-v)

新建文本文件复制下面代码放进去pushd "%~dp0" dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt for /f %%i in (findstr /i . hyper-v.txt 2^>nul) do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i&…

伙伴活动|W3C 标准带头人开讲 WebGPU 前沿趋势

提及 2023 年前端大事件,「WebGPU 的正式发布」无疑占据了一席之地。经过六年的精心打磨,WebGPU 的首个实现版本正式登陆 Chrome,不仅标志着浏览器图形性能的一大飞跃,也让众多从业者兴奋不已。WebGPU 允许网页代码以一种高性能且安全可靠的方式访问 GPU 功能,这一规范正由…

java中WGS84坐标(ios)转换BD-09坐标(百度坐标)

iPhone的GPS定位(CLLocationManager)获得的经纬坐标是基于WGS-84坐标系(世界标准),Google地图使用的是GCJ-02坐标系(中国特色的火星坐标系),百度的经纬坐标在GCJ-02的基础上再做了次加密,就是BD-09坐标系。public class CoordinateConversion {static double x_PI = 3.1…