PJ可能会考的模拟与枚举-自学教程
PJ可能会考的模拟与枚举-自学教程
文/Pleiades_Antares
之前学校里看一个小可爱复习的时候偷偷听来着XD
简单记了一下重点吧,希望能对看官您有所帮助XD
以下⬇️是几个复习时讲过的题,里面放了一下笔记啦!重点是笔记和方法昂
然后过几天我会出一个NOIP初赛复习的帖子吧带着大家过一遍。
程序是次要的重点是理解+文字,因为是上课顺便记的草稿,所以很多是不全的orz
表达式求值
//
// 表达式求值.cpp
//
//
//
//scanf
//"%[]"
//luoguP1981
#include <cstdio>
#include<iostream>
using namespace std;
const int maxn=100050;
int a[maxn];
char op[maxn];
int main(){
int n=0;
while(scanf("%d%[+*]",&a[n],&op[n])==2) {
n++;
}
n++;
//不结束就一直乘下去
int ans=0;
for(int i=0;i<n;i++){
int t=a[i]%10000;
for(;i<n&&op[i]=='*';i++){
t*=a[i+1];
t%=10000;
}
ans+=t;
ans%=10000;
}
printf("%d\n",ans);
return 0;
}
寻宝
//
// 寻宝.cpp
//
//
//
//
#include <cstdio>
#include<iostream>
using namespace std;
int main(){
return 0;
}
//模拟这里常见的问题
//模拟题目需要清晰的思路,找到尽量简洁的实现,这些取决于平时的积累也就是刷题量。这方面代码能力的提升不仅是靠刷模拟题,在做各种题目的时候,注意其代码实现的方式,也可以参考一些经验丰富的人的做法,这一点在以后的学习之路上都是适用的。
选数
//
// 选数.cpp
//
//
//
//
//P1036
//枚举精讲内容题目1
#include <cstdio>
#include<iostream>
using namespace std;
const int maxn=25;
int n,k;
int x[maxn];
int ans;
bool isPrime(int a){
if (a==2||3) return 1;
for(int i=2;i*i<=a;i++){
if (a%i==0) return 0;
}
return 1;
}
void dfs(int cnt,int now,int sum){
if (now==n){
if (cnt==k&&isPrime(sum)){
ans++;
}
}
else{
dfs(cnt,now+1,sum);
dfs(cnt+1,now+1,sum+x[now]);
}
}
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>x[i];
}
dfs(0,0,0);
cout<<ans<<endl;
return 0;
}
//DFS枚举
//非常重要的一段DFS代码!!
int ans;
int a[maxn];
int n,k;
void dfs(int now,int cnt,int s){
if (now==n){
if (cnt==k&&isPrime(s)){
ans++;
}
}
else{
dfs(now+1,cnt,s);//第一种情况,不选这个数
dfs(now+1,cnt+1,s+a[now]);//选了的话
}
}
dfs(0,0,0);
//DFS枚举排列
int ans,n,p[maxn];
bool flag[maxn];
void dfs(int now){
if (test(p)) {
ans++;
}
else {
for(int i=1;i<=n;i++){
if (!flag[i]){
p[now]=i;
flag[i]=true;
dfs(now+1);
flag[i]=false;
}
}
}
}
dfs(0);
//DFS:用递归来枚举很多很多的变量
//图论DFS是寻找最短路,但是这个主要是寻找解什么的...
//更高效的枚举集合
//前置知识:位运算
//将最低位记作第0位,二进制表示第i位为1则表示取集合中的第i位元素
for(int state=0;state<(1<<n);state++){
int s=0;
for(int i=0;i<n;i++){
if (state&(1<<i)){
s+=a[i];
}
}
}
//更高效的枚举排列
//algorithm
//std::next_permutation
//std::prev_permutation
//STL中的函数,接受两个参数表示数组的起止位置。
//会将数组变为对应的下/上一个排列
//如果当前数组是最后一个排列,则变为第一个排列,并且返回false,否则返回true
//时间复杂度O(n)
#include<algorithm>
int p[maxn];
for(int i=0;i<n;i++){
p[i]=i+1;
}
do{
test(p);
}while(std::next_permutation(p,p+n));
//test是啥?比如判断是否是最优的解或者计数的东西等等等等...
火星人
//
// 火星人.cpp
//
//
//
//
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=10005;
int n;
int m;
int a[maxn];
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=m;i++){
next_permutation(a+1,a+1+n);
}
for(int i=1;i<=n;i++){
cout<<a[i]<<" ";
}
return 0;
}
//小结:以上两种方法,对特定的枚举都有显著减少代码长度和常数的优势
//但是当无用状态较多的时候,DFS可以设计各种剪枝优化,能过掉更大的数据
导弹拦截,只给思路
//
// 导弹拦截.cpp
//
//
// Created by demi on 2018/10/1.
//
#include<iostream>
#include<cstdio>
using nameespace std;
int n;
struct T {
ll d1,d2;
T(){}
}
int n;
int
//由于实际要取的是数组后缀的导弹距离第二个系统距离最大值,可以预处理
//按照后缀从短到长处理,每次添加一个导弹,维护最大值
另外一道经典题目
//
// another练习.cpp
//
//
//
//
//题目描述
//给出一个正整数集合,求出有多少组数,满足(a+b-c)*d/e=f,且六个数均在集合内
//注:
int cnt[maxn],ans;
for(int f=0;f<n;f++){
cnt[x[f]]++;
}
for(int a=0;a<n;a++){
for(int b=0;b<n;b++){
for(int c=0;c<n;c++){
for(int d=0;d<n;d++){
for(int e=0;e<n;e++){
ans+=cnt[(x[a]+x[b]-x[c])*x[d]/x[e]];
}
}
}
}
}
//难道要这个样子吗?
//错误1:没有处理不能整除(WA)
//错误2:没有判断负数(RE)
//Meet-in-他和-middle
int cnt[maxn],ans;
for(int f=0;f<n;f++){
for(int e=0;e<n;e++){
for(int d=0;d<n;d++){
if (!x[f]*f[e]%f[d]&& x[f]*f[e]/f[d] < maxn ){
cnt[x[f]*f[e]/f[d]]++;
}
}
}
}
for(int a=0;a<n;a++){
for(int b=0;b<n;b++){
for(int c=0;c<n;c++){
if (x[a]+x[b]-x[c])
}
}
}
//有多个变量需要枚举时,可以枚举一部分,计算出中间值
//再枚举另一个部分,寻找是否有对应的中间值
//寻找部分可用到二分查找或者std::set
经典题目+1
//
// 经典题目加一.cpp
//
//
//
//
#include<iostream>
#include<cstdio>
using namespace std;
//思路1:枚举每个区间的左右端点,再循环求和,O(n三次方)
//思路2:枚举左端点后考虑合法的右端点,
//可以发现是左端点后面的一段连续区间
//找到最大的右端点,计数即可。O(n方)
Two-Pointers
int ans=0;
int l,r,tsum;
for(l=0;l<n;l++){
for(;tsum+a[r]<=k&&r<n;r++){
tsum+=a[r];
}
ams+=r-l;
tsum-=a[l];
}
然后说明一下MAC端怎么编程
Xcode很好用呐完全不需要用在线IDE(当然有一些特别好看还是值得用的233)
据说很火的sublime是编辑器不是编译器!!!
but很多人不会用xcode
这里说一下:
运行terminal配合xcode完全OK
mac os应该是内置的g++和c++
输入如下图指令(图片来源:洛谷IDdemi用户,已获得授权)

可能我太老了还在用原始方法吧qwq
PJ可能会考的模拟与枚举-自学教程的更多相关文章
- 清北学堂—2020.1提高储备营—Day 1 morning(模拟、枚举、搜索)
qbxt Day 1 morning --2020.1.17 济南 主讲:李佳实 目录一览 1.模拟和枚举 2.基础搜索算法(DFS.BFS.记忆化搜索)以及进阶搜索算法(纯靠自学) 总知识点:基础算 ...
- Python中模拟enum枚举类型的5种方法分享
这篇文章主要介绍了Python中模拟enum枚举类型的5种方法分享,本文直接给出实现代码,需要的朋友可以参考下 以下几种方法来模拟enum:(感觉方法一简单实用) 复制代码代码如下: # way1 ...
- HMM 自学教程(八)总结
本系列文章摘自 52nlp(我爱自然语言处理: http://www.52nlp.cn/),原文链接在HMM 学习最佳范例,这是针对国外网站上一个 HMM 教程的翻译,作者功底很深,翻译得很精彩,且在 ...
- HMM 自学教程(七)前向后向算法
本系列文章摘自 52nlp(我爱自然语言处理: http://www.52nlp.cn/),原文链接在 HMM 学习最佳范例,这是针对 国外网站上一个 HMM 教程 的翻译,作者功底很深,翻译得很精彩 ...
- HMM 自学教程(六)维特比算法
本系列文章摘自 52nlp(我爱自然语言处理: http://www.52nlp.cn/),原文链接在 HMM 学习最佳范例,这是针对 国外网站上一个 HMM 教程 的翻译,作者功底很深,翻译得很精彩 ...
- HMM 自学教程(五)前向算法
本系列文章摘自 52nlp(我爱自然语言处理: http://www.52nlp.cn/),原文链接在 HMM 学习最佳范例,这是针对 国外网站上一个 HMM 教程 的翻译,作者功底很深,翻译得很精彩 ...
- HMM 自学教程(四)隐马尔科夫模型
本系列文章摘自 52nlp(我爱自然语言处理: http://www.52nlp.cn/),原文链接在 HMM 学习最佳范例,这是针对 国外网站上一个 HMM 教程 的翻译,作者功底很深,翻译得很精彩 ...
- HMM 自学教程(三)隐藏模式
本系列文章摘自 52nlp(我爱自然语言处理: http://www.52nlp.cn/),原文链接在 HMM 学习最佳范例,这是针对 国外网站上一个 HMM 教程 的翻译,作者功底很深,翻译得很精彩 ...
- HMM 自学教程(二)生成模型
本系列文章摘自 52nlp(我爱自然语言处理: http://www.52nlp.cn/),原文链接在 HMM 学习最佳范例,这是针对 国外网站上一个 HMM 教程 的翻译,作者功底很深,翻译得很精彩 ...
随机推荐
- 《剑指offer》内容总结
(1)剑指Offer——Trie树(字典树) Trie树 Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种.典型应用是统计和排序大量的字符串(但不仅限于字符串),所以经常 ...
- ruby Enumerator::lazy
当一个很大的数组或集合需要做循环操作的时候,一次性把数据放到内存会有很大弊端.这时lazy就派上用场了.Float::INFINITY 是无穷大意思 举个例子 取出1到无穷大对7整除余数为0的前10个 ...
- Java和Python分别实现直接选择排序
1.基本思想 将指定排序位置与其他数组元素分别对比,如果满足条件就进行交换.个人理解其实就是每趟循环从数组里选一个最大的值(最小的值)放到数组最后(最前). 2.算法实现 这里以每趟循环从数组中选择一 ...
- [JZOJ5970] Space
Description 在一个四维空间中,给 \(4\) 个 \(n\) 的排列 \(A,B,C,D\),对于点 \((x,y,z,w)\) ,到点 \((A_x,B_y,C_z,D_w)\) 的花费 ...
- httpd配置文件httpd.conf规则说明和一些基本指令
apache httpd系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html 本文主要介绍的是httpd的配置文件,包括一些最基本的指令.配置规 ...
- flume中的拦截器
Flume中的拦截器(interceptor),用户Source读取events发送到Sink的时候,在events header中加入一些有用的信息,或者对events的内容进行过滤,完成初步的数据 ...
- module.exports和exports.md
推荐写法 具体解释可以往后看. 'use strict' let app = { // 注册全局对象 ... } ... // 封装工具箱 exports = module.exports = app ...
- IntelliJ IDEA汉化步骤以及乱码解决
1.首先下载intellij idea 2017 汉化补丁 附上资源 链接: https://pan.baidu.com/s/1cHC76m 密码: q23m 2.解压该款汉化补丁到本地(我的资源不需 ...
- 微信小程序 封装请求
在写小程序的时候,每个JS文件都一大堆的请求,看得自己都眼花缭乱,下面看一下怎么对请求方法进行封装. 1,方法封装,在util文件夹下新建文件,创建request.js文件,工具文件,用于对方法封装) ...
- 2017-07-29 中文代码示例教程之Java编程一天入门
Java编程一天入门 v0.0.1 alpha 共享协议 本作使用署名-非商业使用-禁止演绎协议共享. 前言 Java入门代码用中文写(举例如下)更能被新手理解. 由于至今没有看到类似教程, 在此抛砖 ...