枚举与尺取法(蓝桥杯 c++ 模板 题目 代码 注解)

news2024/11/17 17:40:29

目录

组合型枚举(排列组合模板()):

排列型枚举(全排列)模板: 

题目一(公平抽签 排列组合): 

​编辑 代码:

题目二(座次问题 全排列):

代码: 

题目三(排列序数):

代码: 

题目四( 美丽的区间 尺取法):

代码:

 题目五(奇怪的动物园 尺取法):

代码:

组合型枚举(排列组合模板({C_{n}}^{m})):

#include <iostream>//排列组合
#include <vector>
using namespace std;
int n, m;
vector<int> chosen;
void calc(int k)
{
	if ((chosen.size() > m) || (chosen.size() + n - k + 1) < m)//选太多了,选太少了,chosen.size()表示选了几个
		return;
	if (k == n + 1)//最后一个数都已经选完了
	{
		for (int i = 0; i < chosen.size(); i++)
			cout << chosen[i]<<" ";//输出第i个为几
		cout << endl;
		return;
	}
	chosen.push_back(k);//选数字k
	calc(k + 1);//继续往深度遍历
	chosen.pop_back();//不选数字k
	calc(k + 1);//继续往深度遍历
}
int main()
{
	cin >> n >> m;
	calc(1);//从一开始
}

排列型枚举(全排列)模板: 

#include <iostream>//排列型枚举,全排列
#include <vector>
using namespace std;
int n;
int chosen[20];
int book[20] = { 0 };
void calc(int k)
{
	if (k == n + 1)//最后一个数都已经选完了
	{
		for (int i = 1; i <= n; i++)
			cout << chosen[i]<<" ";//输出第i个为几
		cout << endl;
		return;
	}
	for (int i = 1; i <= n; i++)
	{
		if (book[i])//标记是否用过
			continue;
		book[i] = 1;//标记为用了
		chosen[k] = i;//第k个为数字i
		calc(k + 1);//继续往深度遍历
		book[i] = 0;//回溯,没访问过i
		chosen[k] = 0;
	}
}
int main()
{
	cin >> n;
	calc(1);//从一开始
}

题目一(公平抽签 排列组合): 

 代码:

#include<iostream>
#include<vector>
using namespace std;
int n, m;
vector<int> chosen;
vector<string> name;
void calc(int k)
{
    if (chosen.size() > m || chosen.size() + (n - k + 1) < m)//选多了或者选少了,chosen.size()表示选了几个
        return;
    if (k == n + 1)//最后一个也已经选完了
    {
        for (int i = 0; i < chosen.size(); i++)
            cout << name[chosen[i]-1] << " ";
        cout << endl;
    }
   chosen.push_back(k);//选数字k
	calc(k + 1);//继续往深度遍历
	chosen.pop_back();//不选数字k
	calc(k + 1);//继续往深度遍历
}
int main()
{
    cin >> n >> m;
    for (int i = 0; i < n; i++)
    {
        string s;
        cin >> s;
        name.push_back(s);
    }
    calc(1);
}

题目二(座次问题 全排列):

代码: 

#include<iostream>
#include<vector>
using namespace std;
int n;
int chosen[15];
int book[15];//标记是否访问过
string name[15];
void calc(int k)
{
    if (k == n + 1)//最后一个数都已经选完了
    {
        for (int i = 1; i <= n; i++)//输出该排列
        {
            cout << name[chosen[i] - 1] << " ";//name下标从0开始
        }
        cout << endl;
        return;
    }
    for (int i = 1; i <= n; i++)
    {
        if (book[i])//标记是否用过
                 continue;
            book[i] = 1;//标记为用了
            chosen[k] = i;//第k个为数字i
            calc(k + 1);//继续往深度遍历
            book[i] = 0;//回溯,没访问过i
            chosen[k] = 0;
    }
}
int main()
{
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        cin >> name[i];
    }
    calc(1);//从第一个开始
}

题目三(排列序数):

代码: 

 

#include <iostream>//用next_permutation函数进行全排列
#include <algorithm>
using namespace std;
int main()
{
	long long  cnt=0;//记录个数
	string s;
	string s1;
	cin >> s;
	s1 = s;
	sort(s.begin(), s.end());//从大到小排序
	do {
		if (s == s1)//相等的时候跳出
			break;
		cnt++;
	} while (next_permutation(s.begin(), s.end()));//开始遍历
	cout << cnt;

}

尺取法是一种线性的高效率算法。记(L,R)为一个序列内以L为起点的最短合法区间,如果R随L的增大而增大的,就可以使用尺取法。具体的做法是不断的枚举L,同时求出R。因为R随L增大而增大,所以总时间复杂度为O(n)

题目四( 美丽的区间 尺取法):

代码:

#include <iostream>
using namespace std;
int n, s;
int ans = 1e8, sum = 0;
int a[100010];
int main()
{
    cin >> n >> s;
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    for (int l = 1, r = 1; r <= n; )
    {
      if(sum<s)//不大于s,则加上,往右遍历
      {
        sum+=a[r],r++;
      }
      else
      {
        ans=min(r-l,ans);//取小的
        sum-=a[l];//减掉最左边
        l++;//往下遍历
      }
    }
    if (ans == 1e8)//不存在
        cout << 0;
    else
        cout << ans;
}

 题目五(奇怪的动物园 尺取法):

代码:

#include<iostream>
using namespace std;
int n, m, cnt,ans,ansl=0,ansr=0;//ans记录票价
int a[1010];
int b[1010];//记录x类动物的数量
void In(int x)
{
	if (b[x] == 0) cnt++;//之前没有x类动物,现在加入了,种类cnt++
	b[x]++;//x类动物数量加一
}
void De(int x)
{
	if (b[x] == 1) cnt--;//之前有一个x类动物,现在删掉,种类cnt--
	b[x]--;//x类动物数量减一
}
int main()
{
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
	{
		cin >> a[i];
	}
	ans = n;//最大为一共有的动物数量
	for (int l = 1, r = 1; r <= n; r++)
	{
		In(a[r]);//a[r]这类动物加入
		while (1)
		{
			De(a[l]);//删掉最左边类动物
			if (cnt == m) 
				l++;//删了,cnt等于m,所有种类都选到了,则l++
			else//删了这类动物,不满足cnt等于m,还是要把这类动物加入
			{
				In(a[l]);
				break;
			}
		}
		if (cnt == m && r - l + 1 < ans)//满足所有动物都能看,票价更低了,更新左区间和右区间
		{
			ans = r - l + 1;
			ansl = l, ansr = r;
		}
	}
	if (ansl != 0)
		cout << ansl << " " << ansr;
	else
		cout << 1 << n;
}

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

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

相关文章

财报解读:基本盘稳定后,联想如何进一步抢占AI时代?

从2021年下半年开始&#xff0c;受诸多因素影响&#xff0c;消费电子行业始终处在承压状态&#xff0c;“不景气”这一关键词屡次被市场提及。 但寒气没有持续&#xff0c;可以看到&#xff0c;消费电子行业正在逐渐回暖。国金证券在今年1月的研报中就指出&#xff0c;从多方面…

学习python时一些笔记

1、winr 命令提示符的快捷键 输入cmd进入终端 2、在终端运行桌面上的python文件 cd desktop(桌面) cd是进入该文件夹的意思。 cd .. 回到上一级 运行python时一定要找到文件的所在地 输入python进入&#xff0c;exit()退出%s字符串占位符%d数字占位符%f浮点数占位符input输…

手把手教你零成本获客的教育培训小程序

随着科技的发展&#xff0c;数字化教育成为现代教育的趋势。为了满足教育培训机构的需求&#xff0c;许多教育培训小程序搭建平台应运而生。今天&#xff0c;我们将为大家介绍一种简单快捷的搭建教育培训小程序的方法。 首先&#xff0c;登录【乔拓云】制作平台&#xff0c;进入…

Java毕业设计 基于SpringBoot vue 社团管理系统

Java毕业设计 基于SpringBoot vue 社团管理系统 SpringBoot vue 社团管理系统 功能介绍 社团成员: 登录 首页 社团列表 加入社团申请 我的社团 在线留言 社长: 登录 首页 用户信息管理 入团申请管理 社团活动管理 社团成员管理 社团新闻管理 社团费用管理 系统管理员: 登录…

汽车碰撞与刮伤的实用维修技术,汽车的车身修复与涂装修补教学

一、教程描述 本套汽车维修技术教程&#xff0c;大小7.44G&#xff0c;共有60个文件。 二、教程目录 01-汽车车身修复教程01-安全规则&#xff08;共3课时&#xff09; 02-汽车车身修复教程02-汽车结构&#xff08;共3课时&#xff09; 03-汽车车身修复教程03-汽车修复所使…

复合数据类型(ch3)

将array依次执行以下操作 1.把列表中的元素升序排序。 2.删除列表中的最后一个元素。 3.把列表中第一个元素移动到列表尾部。 4.返回新列表。array [85,96,2,5,3,566,0,91,5234,5555,89,62,34] #*******请输入您的代码********# #***********begin************# def sort_and_…

Groovy(第五节) Groovy 之集合

Groovy 可以直接在语言内使用集合。在 Groovy 中,不需要导入专门的类,也不需要初始化对象。集合是语言本身的本地成员。Groovy 也使集合(或者列表)的操作变得非常容易,为增加和删除项提供了直观的帮助。 可以将范围当作集合 在前一节学习了如何用 Groovy 的范围将循环变得…

项目中遇到的耗时点-(图片缩放里面添加的标记红圈无法缩放)

实现效果 1、需求&#xff1a;显示服务端返回的在线url图片&#xff0c;并且根据标记圈的坐标点和半径绘制到图片上 分析&#xff1a;由于涉及到图片上加标记&#xff0c;可考虑的方案有 1、加个父布局&#xff0c;里面嵌入两个ImageView 2、自定义ImageView、使其支持标图 …

【网站项目】182在线作业管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

docker配置数据默认存储路径graph已过时,新版本中是data-root

错误信息 我在修改/etc/docker/daemon.json文件中&#xff0c;添加存储路径graph字段。然后sudo systemctl restart docker包如下错误&#xff1a;使用journalctl -xeu docker.service错误信息&#xff0c;发现不能匹配graph字段。 原因 我的docker版本&#xff1a; 在doc…

【计算机那些事】

目录 【云计算】 【原神用的是UDP还是TCP】 【几个特殊地址】 【socket是什么】 【内网穿透是什么】 【为什么有HTTP协议&#xff0c;还要有websocket协议】 【科普路由器&#xff0c;集线器&#xff0c;交换机&#xff0c;网桥&#xff0c;光猫】 【USB接口那些事】 …

【Python】进阶学习:pandas--rename()用法详解

【Python】进阶学习&#xff1a;pandas-- rename()用法详解 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到您的…

ZYNQ PS 读取 TF 卡 BIN 文件中的浮点数

动机 在进行 AI 算法加速器设计时&#xff0c;需要读取模型导出的权重和数据集数据作为加速器的输入&#xff0c;而目前我个人比较常用的做法是将权重和数据集(如果数据集过大&#xff0c;可以选择一两张图片)放到 SD/TF 卡中&#xff0c;然后 PS CPU核去进行数据读取&#xff…

Spring:FactoryBean预加载逻辑以及自定义实现Mybatis的接口扫描

Spring&#xff1a;FactoryBean预加载逻辑以及自定义实现Mybatis的接口扫描 1 前言 参考Mybatis框架的Mapper注解扫描Mapper接口的业务逻辑&#xff0c;其中集成Spring的逻辑里使用到了Spring框架的FactoryBean拓展点&#xff0c;本文针对Spring FactoryBean的加载流程进行分…

嵌入式中C语言结构体的实现

C语言中的数组只能允许程序员定义存储相同类型数据。但是结构是C语言编程中允许您存储不同数据类型的数据。 结构体的定义 要想定义结构&#xff0c;必须用到struct关键字&#xff0c;struct的语句格式&#xff1a; 在struct 中声明了一个含有若干新成员的数据类型。 tag 是结构…

Vision Pro开发者学习路线

官方给到的Vision Pro开发者学习路线&#xff1a; 1. 学习基础知识&#xff1a; - 学习 Xcode、Swift 和 SwiftUI 的基础知识&#xff0c;包括语法、UI 设计等。 - 掌握 ARKit 和 SwiftUI 的使用&#xff0c;了解如何创建沉浸式增强现实体验。 2. 学习 3D 建模&#xf…

CleanMyMac X2024测评深度分析与功能全面介绍

一、软件概述 CleanMyMac X 是一款强大的Mac清理和优化工具&#xff0c;它可以帮助用户轻松管理和释放Mac上的空间&#xff0c;优化系统性能&#xff0c;提高运行速度。这款软件以其直观的用户界面和丰富的功能受到了广大Mac用户的欢迎。 CleanMyMac X4.14.6全新版下载如下: …

Xcode :Could not build module ‘WebKit‘ 已验证解决

问题&#xff1a;Could not build module WebKit 具体报错如下&#xff1a; error: type argument nw_proxy_config_t (aka struct nw_proxy_config *) is neither an Objective-C object nor a block type property (nullable, nonatomic, copy) NSArray<nw_proxy_config_…

Python爬虫副业真的可行吗?

首先回答你&#xff0c;是可行的&#xff0c;python爬虫能当副业&#xff0c;副业的方式比较多&#xff0c;等下我会讲几种。 那学到哪个层次可以接单呢&#xff1f;主要看你是接什么样的单&#xff0c;爬一些资料&#xff0c;视频这种简单的学一两个月就没什么问题&#xff0…