【题解】【一题多解】—— [NOIP1998 普及组] 三连击

news2025/2/23 1:09:27

【题解】—— [NOIP1998 普及组] 三连击

  • [NOIP1998 普及组] 三连击
    • 题目背景
    • 题目描述
    • 输入格式
    • 输出格式
    • 输入输出样例
      • 输入 #1
      • 输出 #1
    • 提示
  • 解法1.直接提交答案
  • 解法2.普通枚举
    • 2.1.题意分析
    • 2.2.AC代码
  • 解法3.全排列枚举
    • 3.1.题意分析
    • 3.2.AC代码
  • 解法4.深度优先搜索
    • 4.1.题意分析
    • 4.2.AC代码

[NOIP1998 普及组] 三连击

戳我查看题目(洛谷)

题目背景

本题为提交答案题,您可以写程序或手算在本机上算出答案后,直接提交答案文本,也可提交答案生成程序。

题目描述

1 , 2 , … , 9 1, 2, \ldots , 9 1,2,,9 9 9 9 个数分成 3 3 3 组,分别组成 3 3 3 个三位数,且使这 3 3 3 个三位数构成 1 : 2 : 3 1 : 2 : 3 1:2:3 的比例,试求出所有满足条件的 3 3 3 个三位数。

输入格式

输出格式

若干行,每行 3 3 3 个数字。按照每行第 1 1 1 个数字升序排列。

输入输出样例

输入 #1

输出 #1

192 384 576
* * *
...

* * *
(剩余部分不予展示)

提示

NOIP1998 普及组 第一题

解法1.直接提交答案

//建议大家不要这么做,做算法题是为了锻炼思维的。而不是一味地完成任务似的刷题。
#include<bits/stdc++.h>
using namespace std;
int main()
{
    cout<<"192 384 576"<<endl;
    cout<<"219 438 657"<<endl;
    cout<<"273 546 819"<<endl;
    cout<<"327 654 981"<<endl;
    return 0;
}

解法2.普通枚举

2.1.题意分析

    对于这道题,如果我们分别选择枚举abc,那么时间复杂都会达到惊人的 O ( n 3 ) O(n^3) O(n3)虽然本质上还是常数级别复杂度

    我们可以选择只枚举a, 通过a来算出bc

    那么接下来就只需要解决检查是否符合要求的问题了。在这里,我们可以使用类似于计数排序的方法。定义一个pail数组,pail[i]表示数字i出现的次数,我们可以称之为“桶”。如果某个数字没有出现,那么就是不符合要求。

    首先定义一个分解数字到“桶”里的go函数

int pail[10];
void go(int x)//将三位数分解到桶里 
{
	pail[x%10]++;
	pail[x/10%10]++;
	pail[x/100]++;
}

    然后是检查是否符合要求的check函数

bool check(int a,int b,int c) 
{
	memset(pail,0,sizeof(pail));//初始化桶 
	go(a);go(b);go(c);//分解 
	for(int i=1;i<=9;i++)//如果有数没有出现就返回假 
	    if(!pail[i])
	        return 0;
	return 1;
}

注意:枚举a的范围只需要从123~987

2.2.AC代码

#include<bits/stdc++.h>
using namespace std;
int pail[10];
void go(int x)//将三位数分解到桶里 
{
	pail[x%10]++;
	pail[x/10%10]++;
	pail[x/100]++;
}
bool check(int a,int b,int c) 
{
	memset(pail,0,sizeof(pail));//初始化桶 
	go(a);go(b);go(c);//分解 
	for(int i=1;i<=9;i++)//如果有数没有出现就返回假 
	    if(!pail[i])
	        return 0;
	return 1;
}
int main()
{
    int a,b,c;
    for(a=123;a<=987;a++)//枚举a 
    {
    	b=a*2;c=a*3;//通过a算出b和c 
    	if(check(a,b,c))//检查 
		    cout<<a<<' '<<b<<' '<<c<<endl;
	}
	return 0;
}

解法3.全排列枚举

3.1.题意分析

    因为abc总共拥有的数字都只有1~9,是不变的。所以可以考虑使用STL里的next_permutation函数。具体语法如下:

next_permutation(数组名+1,数组名+需要排列的长度+1);

    它的作用是生成一个排列的下一个字典序稍大的排列。如果这个排列已经是字典序最大的排列,返回0,否则返回1

    比如求123的全排列就可以这样写:

int num[]={0,1,2,3};//这里初始化要多加一个0,用来占位
do
{
    cout<<num[1]<<num[2]<<num[3]<<endl;
}while(next_permutation(num+1,num+4));

输出:

123
132
213
231
312
321

如果还不懂可以拿洛谷 P1088 [NOIP2004 普及组] 火星人练练手。

    那么我们只需要定义一个数组num,并不断生成它的下一个排列,再分别计算abc并判断就好了。

3.2.AC代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int num[15]={0,1,2,3,4,5,6,7,8,9},a,b,c,cnt=0;//数组初始化 
    do
    {
    	a=num[1]*100+num[2]*10+num[3];//计算三个数 
    	b=num[4]*100+num[5]*10+num[6];
    	c=num[7]*100+num[8]*10+num[9];
        if(a*2==b*1&&a*3==c*1)
            cout<<a<<' '<<b<<' '<<c<<endl; 
	}while(next_permutation(num+1,num+10));//重复生成下一个全排列 
	return 0;
}

解法4.深度优先搜索

    如果还没学搜索的同学看完上面就已经够用了。如果想要练习深度优先搜索可以看看我下面的解法。

4.1.题意分析

    众所周知,搜索是优雅的暴力枚举

    这里跟上面的策略一样,使用一个is_have数组作为“桶”。然后使用一个可变数组vector来储存abc

不知道vector是什么的同学就把它当普通数组就好了。有实力的也可以把代码改成使用普通数组

    然后直接套dfs模版就行了。

这判断条件都要把我写吐血了

4.2.AC代码

#include<bits/stdc++.h>
using namespace std;
bool is_have[10];//用is_have数组标记每个数是否出现 
vector<int>a;
void dfs(int step)
{
	if(step>9)//判断是否符合条件
	    if((a[6]*100+a[7]*10+a[8])*1.0/(a[0]*100+a[1]*10+a[2])==3&&
		   (a[3]*100+a[4]*10+a[5])*1.0/(a[0]*100+a[1]*10+a[2])==2)
		{
			for(int i=0;i<9;i++)
			{
				cout<<a[i];
				if((i+1)%3==0)
				    cout<<' ';//满三个数就输出一个空格
			}
			cout<<endl;
		}
	for(int i=1;i<=9;i++)
		if(!is_have[i])
		{
			a.push_back(i);//填空 
			is_have[i]=1;
			dfs(step+1);//填下一个空 
			a.pop_back();//恢复现场 
			is_have[i]=0;
		}
}
int main()
{
    dfs(1);//从1开始填 
	return 0;
}

喜欢就订阅此专辑吧!

【蓝胖子编程教育简介】
蓝胖子编程教育,是一家面向青少年的编程教育平台。平台为全国青少年提供最专业的编程教育服务,包括提供最新最详细的编程相关资讯、最专业的竞赛指导、最合理的课程规划等。本平台利用趣味性和互动性强的教学方式,旨在激发孩子们对编程的兴趣,培养他们的逻辑思维能力和创造力,让孩子们在轻松愉快的氛围中掌握编程知识,为未来科技人才的培养奠定坚实基础。

欢迎扫码关注蓝胖子编程教育
在这里插入图片描述

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

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

相关文章

宝塔面板屏蔽 Censys,防止源站 IP 泄露

Censys 搜索引擎很强大。Censys 每天都会扫描 IPv4 地址空间&#xff0c;以搜索所有联网设备并收集相关的信息&#xff0c;并返回一份有关资源&#xff08;如设备、网站和证书&#xff09;配置和部署信息的总体报告。 在 IP 前加上 https 访问时&#xff0c;Nginx 会自动返回该…

嵌入式学习 20(Linux高级编程——文件——misc)

文件操作相关函数 一、symlink 函数 int symlink(const char *oldpath, const char *newpath); 功能&#xff1a; 创建一个指向 oldpath 文件的新的符号链接&#xff08;软链接&#xff09;文件。 参数&#xff1a; • oldpath&#xff1a;被链接指向的原始文件的路径。 • …

spring事务失效问题可以这样解决

今天咱们就来聊聊在Spring事务管理中你可能踩过的坑&#xff0c;并教你如何规避这些陷阱。 事务提交的陷阱 有时&#xff0c;事务方法在抛出异常后没有回滚&#xff0c;而是被提交了。 这通常是由于异常被捕获但没有显式抛出&#xff0c;导致Spring误以为事务正常完成。 错…

Review Learning : 推进一体化超高清图像恢复训练方法

Review Learning: Advancing All-in-One Ultra-High-Definition Image Restoration Training Method 摘要 一体化图像恢复任务变得越来越重要&#xff0c;特别是对于超高清&#xff08;UHD&#xff09;图像。 现有的一体机UHD图像恢复方法通常通过引入针对不同退化类型的即时…

小区团购管理

TOC springboot254小区团购管理 第1章 绪论 1.1选题动因 当前的网络技术&#xff0c;软件技术等都具备成熟的理论基础&#xff0c;市场上也出现各种技术开发的软件&#xff0c;这些软件都被用于各个领域&#xff0c;包括生活和工作的领域。随着电脑和笔记本的广泛运用&…

一文搞懂后端面试之数据库综合应用【中间件 | 数据库 | MySQL | 高可用 | 高性能】

查询缓存 在MySQL里面&#xff0c;允许用户开启查询缓存。你可以理解这个缓存就是用SQL作为键&#xff0c;而对应的查询结果集就是值。如果下次过来的还是同一个查询&#xff0c;那么就直接返回缓存起来的查询结果集。 但是查询缓存不一定带来查询性能提升。如果你的查询每一…

接口隔离原则

接口隔离原则 接口隔离原则就是客户端不应该依赖它不需要的接口&#xff0c;或者说类间的依赖关系应该建立在最小的接口上。 我们以搜索美女为例&#xff0c;设计了如下的类图&#xff1a; 源代码如下。美女及其实现类&#xff1a; 搜索程序及其子类源代码如下&#xff1a; 最…

0101中文乱码-BufferedImage-图片处理

文章目录 1、问题描述2 、电子证书生成3、中文乱码原因及修复4、思考 结语 1、问题描述 接手维护一个休闲赛事类项目&#xff0c;因为服务器到期&#xff0c;项目从云服务器迁移到本地服务器。 项目生成比赛&#xff0c;分为二人组、三人组等等的团体&#xff1b;比赛设置几个…

判断矩阵中的一致性检验是指什么

判断矩阵中的一致性检验通常指的是在层次分析法&#xff08;Analytic Hierarchy Process, AHP&#xff09;中&#xff0c;用于评估决策者在构造判断矩阵时的逻辑一致性。 在AHP中&#xff0c;决策者需要比较成对的因素&#xff0c;并为每对因素的相对重要性赋予一个数值&#…

什么是haproxy七层代理

一.负载均衡 1.1.什么是负载均衡 负载均衡&#xff1a;Load Balance&#xff0c;简称LB&#xff0c;是一种服务或基于硬件设备等实现的高可用反向代理技术&#xff0c;负载均 衡将特定的业务(web服务、网络流量等)分担给指定的一个或多个后端特定的服务器或设备&#xff0c;从…

DriftingBlues2靶机渗透测试

DriftingBlues2靶机 文章目录 DriftingBlues2靶机信息收集FTP渗透web渗透权限提升靶机总结 信息收集 nmap扫描得到21,22和80端口&#xff0c;其中21ftp协议可以使用匿名用户登录 使用目录扫描一下网站&#xff0c;得到了blog目录 FTP渗透 匿名用户登录进去&#xff0c;发现…

QT移除窗体的最大化和最小化按钮

效果 代码位置 代码 int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.setWindowFlags(w.windowFlags() & ~Qt::WindowMaximizeButtonHint & ~Qt::WindowMinimizeButtonHint);w.show();return a.exec(); }

考研数学想考120,把李林880做到准确率80%以上够吗?

考研数学想考120&#xff0c;把880题做到正确率80%以上是不够的 因为最近几年的考研数学变化&#xff0c;很大&#xff0c;传统的背题型的备考方式已经没用了&#xff0c;而880题是这种模式的佼佼者&#xff0c;25版的880变动又很小&#xff0c;只加了40道比较综合的题目在每一…

python基础命令学习

1.Python基础知识 目录 1.Python基础知识1.1 变量及类型1.2 标识符与关键字1.3 输出与输入1.3.1格式化符号1.3.2转义字符1.3.3结束符1.3.4输入的特点 1.4 运算符1.4.1 算数运算符1.4.2 赋值运算符1.4.3 比较(即关系)运算符1.4.4 逻辑运算符 1.5 数据类型转换1.6 判断与循环语句…

【K8S系列】Kubernetes基础介绍

一、前言 搭建完k8s集群后&#xff0c;正式进入k8s相关知识点的理论了解。并结合官方文档逐步总结涉及k8s各类知识点&#xff0c;希望能对正在学习的或将要学习得到小伙伴有所帮助。 二、系统部署历程回顾 传统部署时代&#xff1a; 早期&#xff0c;各个组织是在物理服务器…

[python]uiautomation.WindowControl函数用法

Python UIAutomation 窗口控件 介绍 在本文中&#xff0c;我们将探讨Python UIAutomation库以及如何使用它来控制和自动化Windows应用程序。我们将介绍UIAutomation的基础知识及其功能&#xff0c;并提供代码示例来演示其用法。 什么是UI自动化&#xff1f; UIAutomation是一个…

Java中常用的设计模式

一、什么是设计模式 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程…

【机器学习】探索数据矿藏:Python中的AI大模型与数据挖掘创新实践

&#x1f496; 前言&#xff1a;探索数据矿藏1. &#x1f4ca;数据获取与预处理&#xff1a;AI大模型的燃料1.1 &#x1f310;数据获取&#xff1a;多样性与规模并重1.2 &#x1f9f9;数据清洗与处理&#xff1a;提升数据质量1.3 &#x1f50d;特征工程&#xff1a;挖掘数据的深…

稠密检索的规模艺术:模型、数据与性能的精准匹配

论文&#xff1a;https://arxiv.org/pdf/2403.18684代码&#xff1a;GitHub - jingtaozhan/DRScale机构&#xff1a;清华大学领域&#xff1a;稠密检索、Scaling Laws发表&#xff1a;SIGIR2024最佳论文 Abstract Scaling Laws已经在广泛的任务中被观察到&#xff0c;特别是在…

JavaScript基础——闭包

闭包简介 闭包的作用 闭包可以保留变量的状态 闭包可以让变量私有化 闭包的缺点 闭包简介 在JavaScript中&#xff0c;重复声明同一个变量会导致变量冲突&#xff0c;在这个时候可以使用闭包创建独立的执行环境。 在JavaScript中&#xff0c;闭包是指封闭的执行环境&#xff…