洛古P1036 选数 题解
[我是传送门]
这是一道很经典的深搜与回溯(难度一般)
可是就这个"普及-"
让本蒟蒻做了一晚上+半个上午(实际我不会深搜回溯,全靠框架+去重);
下面让我分享下本蒟蒻的(全排列+暴搜去重)
#include<bits/stdc++.h>
using namespace std;
int n,r,ttt;//n是总数,r是选的数,ttt是答案
int a[],b2[],c[][];//a用来储存排列的编号,b2用来储存输入的数,c用来去重(储存符合条件的数组的编号)
bool b[];//用来判断是否用过
bool ss2(int t[]){//暴搜判重
int tot=;//计数器
for(int i=;i<=ttt;i++){//循环所有储存的数组
for(int j=;j<=r;j++){//循环r次,比较每一个字符
if(t[j] != c[i][j])//判重
tot++;
}
if(tot==)//如果没有一个不一样的说明重复
return ;
tot=;//一定要清空!!!!
}
return ;//如果全不重复,说明不重
}
bool sus(int y){//判断素数
if(y==||y==)//防止特殊值
return ;
if(y==)
return ;
for(int i=;i<=sqrt(y);i++){//循环到sqrt就够了
if(y%i==)
return ;
}
return ;
}
void print(){//其实不能叫print,因为没有输出 int y=;
int b3[r+];//定义新数组避免动原先(a)数组
for(int i=;i<=r;i++)//判断素数
y+=b2[a[i]];
if(sus(y)==){//不是素数直接跳过
for(int i=;i<=r;i++)
b3[i]=a[i];
sort(b3+,b3+r+);//一定要排序,因为类似"组合"
if(ss2(b3)==){//如果不重复
u++;//这一步可以不要
ttt++;//答案加1
for(int i=;i<=r;i++)
c[u][i]=b3[i] ;//如果不要u++这里u要换成ttt
} } }
void ss(int k){//程序主体
for(int i=;i<=n;i++){
if(b[i] ==){//只要没标记过就能用
a[k]=i;//记录编号
b[i]=;//标记
if(k==r) print();//到了r"输出"
else ss(k+);//否则继续
b[i]=;//回溯
}
}
}
int main(){
cin>>n>>r;//输入
for(int i=;i<=n;i++)
cin>>b2[i];
ss();//深搜
cout<<ttt;//输出答案
return ;
}
洛古P1036 选数 题解的更多相关文章
- 洛谷P1036 选数 题解 简单搜索/简单状态压缩枚举
题目链接:https://www.luogu.com.cn/problem/P1036 题目描述 已知 \(n\) 个整数 \(x_1,x_2,-,x_n\) ,以及 \(1\) 个整数 \(k(k& ...
- 【搜索】【入门】洛谷P1036 选数
题目描述 已知 n个整数x1,x2,…,xn,以及1个整数k(k<n).从nn个整数中任选kk个整数相加,可分别得到一系列的和. 例如当n=4,k=3,4个整数分别为3,7,12,19时, ...
- P1036 选数 题解
题目链接https://www.luogu.org/problemnew/show/P1036 题目描述 已知 nnn 个整数 x1,x2,-,xnx_1,x_2,-,x_nx1,x2,-,xn ...
- 洛谷 P1036 选数
嗯.... 这种类型的题在新手村出现还是比较正常的, 但是不知道为什么它的分类竟然是过程函数与递归!!!(难道这不是一个深搜题吗??? 好吧这就是一道深搜题,所以千万别被误导... 先看一下题目: 题 ...
- (水题)洛谷 - P1036 - 选数
https://www.luogu.org/problemnew/show/P1036 $n$ 才20的数据量,我当时居然还在想怎么分组组合,直接 $2^{20}$ 暴力搞就行了. $x_i $太大了 ...
- 洛谷P1036选数(素数+组合数)
题目链接:https://www.luogu.org/problemnew/show/P1036 主要考两个知识点:判断一个数是否为素数.从n个数中选出m个数的组合 判断一个数是否为素数: 素数一定是 ...
- 洛谷——P1036 选数
题目描述 已知 n 个整数 x1,x2,…,xn,以及一个整数 k(k<n).从 n 个整数中任选 k 个整数相加,可分别得到一系列的和.例如当 n=4,k=3,4 个整数分别为 3,7,12, ...
- 【洛谷P1036 选数】
这个题显然用到了深搜的内容 让我们跟着代码找思路 #include<bits/stdc++.h>//万能头 ],ans; inline bool prime(int n)//最简单的判定素 ...
- 洛谷 P1036 选数【背包型DFS/选or不选】
题目描述 已知 n 个整数 x1,x2,…,xn,以及一个整数 k(k<n).从 n 个整数中任选 k 个整数相加,可分别得到一系列的和.例如当 n=4,k=3,4 个整数分别为 3,7,12, ...
随机推荐
- MySQL——修改数据库远程权限
语句 赋予权限 ON *.*前一个*代表库后一个代表表 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'xxxxx' WITH GRA ...
- JVM运行时内存组成分为一些线程私
JVM运行时内存组成分为一些线程私有的,其他的是线程共享的. 线程私有 程序计数器:当前线程所执行的字节码的行号指示器. Java虚拟机栈:java方法执行的内存模型,每个方法被执行时都会创建一个栈帧 ...
- Memory Layout for Multiple and Virtual Inheritance
Memory Layout for Multiple and Virtual Inheritance(By Edsko de Vries, January 2006)Warning. This art ...
- Linux端口被占用的解决(附Python专版)
先说一般情况的解决: lsof -i:8000 查出PID,然后 kill掉程序,接着就可以了 软件重启之后绑定没有释放,lsof -i:8080也查不出来占用的情况 再来个长连接版Python解决法 ...
- gcc __thread关键字
https://blog.csdn.net/xj178926426/article/details/54345449 EventLoop.cpp __thread EventLoop* t_loopI ...
- 任意模数NTT学习笔记
这两天有点颓,所以东西学的也很慢...这个一眼就能推出来的活生生卡了我两天.. 说几个细节: 柿子: \[f*g = (\frac{f}{M} +f\%m)*(\frac{g}{M} +g\%m) \ ...
- git && gitlab 使用
安装略过 使用 基于公钥的认证登录,方便对用户进行权限控制 useradd -s /usr/bin/git-shell testgit #创建一个用户 或者直接useradd testgit 然后去/ ...
- CMDB资产管理系统开发【day26】:admin action
本节目标 审核写到数据库,我就单独写一个如下的 页面 单机go后就跳转到如下图界面,我们这节课的目标就是写一个这样的页面 asset\admin.py部分代码 注释如下: class NewAsset ...
- 第六节: 六类Calander处理六种不同的时间场景
背景介绍及其使用 该章节主要补充介绍,在前一章四类触发器的基础上配合六大Canlander来动态删减某些时间,来满足更多的应用场景. 1. DailyCalendar:动态排除某天的某些字段. (需求 ...
- SpringBoot系列: Spring项目异常处理最佳实践
===================================自定义异常类===================================稍具规模的项目, 一般都要自定义一组异常类, 这 ...