首页 > 其他分享 >2002NOIP普及组真题 2. 选数

2002NOIP普及组真题 2. 选数

时间:2024-06-10 18:32:26浏览次数:20  
标签:组真题 return int 选数 dfs 素数 ans id 2002NOIP

线上OJ:

【02NOIP普及组】选数

核心思想:

1、使用 模板函数 isPrime() 来判断一个数是否为素数。
2、定义一个函数 dfs 来进行深度优先搜索。在dfs函数中,通过递归的方式遍历所有可能的组合,并计算每个组合的和。

在 dfs 中:
如果坐标 id 超过n,则越界,返回。
如果已选了k个数,且和正好为素数,则 ans 加 1。
否则,就对剩余的 [id+1, n] 个数继续进行枚举深搜

判断素数的模板函数

bool isPrime(int a) 
{
	if(a < 2)  return false;
	for(int i = 2; i * i <= a; i++)
		if(a % i == 0)	return false;	
	return true;
}
题解代码:
#include <bits/stdc++.h>
using namespace std;

int n, k, ans;
int x[25];    

// 判断一个数是否为素数
bool isPrime(int a) 
{
    if(a < 2)  return false;
    for(int i = 2; i * i <= a; i++)
        if(a % i == 0)	return false;
	
    return true;
}

// (当前已选数的和,当前数的索引,已经选了几个数) 
void dfs(int sum, int id, int cnt) 
{
    if (id > n)  return;  // 如果传进来的数的索引已经超过了 n ,则越界,返回 
    else if (k == cnt && isPrime(sum))   // 否则,如果当前传进来已选的数已达到k个,且此时k个数的总和是素数 
        ans++;
    else   // 否则,继续向下深搜(此时,要枚举后续每一个元素) 
    {
        for (int i = id + 1; i <= n; i++)
            dfs(sum + x[i], i, cnt + 1);
    }
}

int main() 
{
    scanf("%d %d", &n, &k);
    for (int i = 1; i <= n; i++)   cin >> x[i];  // 存储的索引为 1~n 

    ans = 0;
    dfs(0, 0, 0);  // (当前已选数的和,当前数的索引,已经选了几个数) 

    printf("%d\n", ans);
    return 0;
}

标签:组真题,return,int,选数,dfs,素数,ans,id,2002NOIP
From: https://blog.csdn.net/weixin_40252159/article/details/139580131

相关文章

  • 2005NOIP普及组真题 4. 循环
    线上OJ:【05NOIP普及组】循环核心思想:高精度1、本题用到了标准的高精度乘法模板voidinit(inta[])//传入一个数组{strings;cin>>s;//读入字符串sa[0]=s.length();//用a[0]计算字符串s的位数for(i=1;i<=a[0];i++)a[i]=s[......
  • 领跑Web 3.0:华贝甄选数字经济新风向
    在数字经济蓬勃发展的今天,华贝甄选凭借其强大的技术实力和创新精神,正在构建一个跨越多个领域的全球化数字产融生态系统。作为天贝集团旗下的一员,华贝甄选不仅继承了集团在金融科技、智慧能源、生物科技等方面的深厚积累,更是在数字化转型的浪潮中独树一帜,以电子商城为起点,通过S2......
  • CSP历年复赛题-P1036 [NOIP2002 普及组] 选数
    原题链接:https://www.luogu.com.cn/problem/P1036题意解读:题目即要在n个数中,枚举出所有的子集,当子集中数字个数刚好为k时,求和,判断是否是素数。解题思路:方法一:二进制法通过二进制法,可以枚举一个集合中所有元素“选”或者“不选”的情况,用二进制1表示选该元素,二进制0表示不选。......
  • P1036 [NOIP2002 普及组] 选数
    传送锚点:https://www.luogu.com.cn/problem/P1036题目描述已知\(n\)个整数\(x_1,x_2,\cdots,x_n\),以及\(1\)个整数\(k\)(\(k<n\))。从\(n\)个整数中任选\(k\)个整数相加,可分别得到一系列的和。例如当\(n=4\),\(k=3\),\(4\)个整数分别为\(3,7,12,19\)时,可得全部的组合......
  • pandas 读取csv 数据,筛选数据
    前言Pandas是一个开源的数据分析和数据处理库,它是基于Python编程语言的。Pandas提供了易于使用的数据结构和数据分析工具,特别适用于处理结构化数据,如表格型数据(类似于Excel表格)。Pandas主要引入了两种新的数据结构:DataFrame和Series。环境准备先pip安装pandas:pi......
  • 2022CSP-J组真题 2.解密
    线上OJ:https://www.luogu.com.cn/problem/P8814核心思想:对本题先进行数学公式推导已知ed=(......
  • 2015年蓝桥杯六届省赛大学B组真题
    2015年蓝桥杯六届省赛大学B组真题1.奖券数目 #include <iostream>using namespace std;int ans;bool check(int i){  while(i){    if(i%10==4)return false;    i/=10;  }  return true;}int main(){  int ans=0;  for(int i=10......
  • 【洛谷P1036】 [NOIP2002 普及组] 选数
    一、题目:二、解题思路:本文章采用的解决方法是递归与DFS(深度优先搜索)。以下图是思路图:1.首先-确定位置题目说4个数字取三个数,所以考虑的只有三个位置和这三个位置分别放什么数值。从第一个位置开始放数。2.其次-开始放数分为4种可能,第一位置可以先放3,那么第二个位置......
  • 蓝桥杯 2022 省A 选数异或
    一种比较无脑暴力点的方法,时间复杂度是(n²+m)。(注意==的优先级比^高,记得加括号(a[i]^a[j])==x)#include<iostream>#include<vector>#include<bits/stdc++.h>//包含一些C++标准库中未包含的特定实现的函数的头文件usingnamespacestd;intmain(){intn,......
  • P1036 [NOIP2002 普及组] 选数
    思路:也算典型的dfs,题目就是要求从n个数中选择k个数,计算这k个数的和,看这个和是否是素数。我们知道在dfs时相当于是进行全排列,而结果要求的是组合后和的情况。根据排列和组合的关系,他们之间差K!倍,所以需要在dfs求得个数cnt后除以k!。题目:AC代码:#include<algorithm>#include<io......