Gym - 101408H Matchsticks

这篇博客探讨了如何使用n根火柴棒构建最大的和最小的数字,无前导零。最大数的构造相对直观,而最小数的构建则需要更复杂的策略。当n为7的倍数时,全摆成'8'是最优解,否则需要通过拆分和组合寻找最小位数。博主提供了详细思路,包括如何处理火柴棒剩余的情况,并建议通过代码实现来更好地理解该问题。

https://oomake.com/question/1736140点击查看更多大佬

题意:

n根火柴,能摆出的最大数和最小数,没有前导零。

思路:

最大数很简单,n是偶数就“111”,是奇数就"711",位数尽可能大。

最小数位数要尽可能小,如果n是7的倍数,全摆成‘8’是最优的;如果不是,那我们要让当前摆的值尽可能小,这句话不好理解,一般你看懂代码才能明白,接下来我会用更简单的思路来让你理解这种解法。

思路详解:

假如我们有n根火柴,要摆出最小的数,我们会先摆‘8’,消耗尽可能多的火柴,会出现多{0,1,2,3,4,5,6}根火柴的情况,多0已经是最优解,不必理会;多1,我们拆‘8’,n>=2不会出现给你1根的情况,我们一定有‘8’拆,把‘8’拆成‘0’,组合成‘10’是最优的;多2,最优解‘18’;多3,继续拆‘8’得‘0’,如果‘8’拆成‘0’还不够怎么办?这个就需要你自己算一下只摆两位数时的最优解了(如上图),我们现在要摆‘2’,可以注意到多4多5也是优先摆‘2’,多6就要优先摆‘6’,最终大体上的方向就是‘8’完‘0’变,不够就往最优拆。

然后,我们思考一下,这个思路有没有问题?我们还要考虑没‘8’拆的情况,也就是一位数(n<=7),我们应该再深入模拟一下,因为我们并不知道这样的思路能不能保证位数最低,答案应该是什么样子的?‘888’;‘x888’;‘x08’;‘x00’;‘100’;‘108’。。。是不是最优解和‘0’‘8’的组合。我们记录剩下的火柴数,如果‘8’刚好用光,最优;如果剩1,2,先摆‘1’,剩下的火柴不能全‘8’的话就‘0’,就是‘8’拆成‘0’,不会有很奇怪的情况;如果剩3,4,5,先摆‘2’,剩下的不能全‘8’就摆‘0’,同上,觉得奇怪就代一下,最后一位判断一下;剩‘6’同上。废话有点多,之后如果能想的更清晰,再来更新一下,具体看代码理解。

#include <bits/stdc++.h>
#define insert_num(x) 	{v.push_back(x+'0');num_flag=x;}
using namespace std;

int main(int argc, char const *argv[])
{
	int t,n;
	scanf("%d",&t);
	int min_num[]={8,-1,1,7,4,2,6,8};
	int val[]={6,2,5,5,4,5,6,3,7,6};
	vector<char> v,v0;
	while(t--)
	{
		scanf("%d",&n);
		int a=n;
		int flag=1,num_flag;
		int c=ceil(a/7.);//注意用double型
		v.clear();
		v0.clear();
		while(c)
		{
			if(c==1)
			{
				int tmp=min_num[a];
				if(!flag&&a==6)  tmp=0; 
				insert_num(tmp)
			}
			else if(a%7==0)
			{
				v.insert(v.end(),c,'8');
				break;
			}
			else
			{
				if(flag)
				{
					if(a%7<=2) insert_num(1)
					else if(a%7<6) insert_num(2)
					else if(a%7==6) insert_num(6)
				}
				else
					insert_num(0);
			}
			a=a-val[num_flag];
			c=ceil(a/7.);
			flag=0;
		}
		if(n%2) 
		{
			v0.push_back('7');
			v0.insert(v0.end(),(n-3)/2,'1');
		}
		else v0.insert(v0.end(),n/2,'1');
		string min_s=string(v.begin(),v.end());
		string max_s=string(v0.begin(),v0.end());
		cout<<min_s<<" "<<max_s<<endl;
	}
	return 0;
}

 

 

标题基于Python的汽车之家网站舆情分析系统研究AI更换标题第1章引言阐述汽车之家网站舆情分析的研究背景、意义、国内外研究现状、论文方法及创新点。1.1研究背景与意义说明汽车之家网站舆情分析对汽车行业及消费者的重要性。1.2国内外研究现状概述国内外在汽车舆情分析领域的研究进展与成果。1.3论文方法及创新点介绍本文采用的研究方法及相较于前人的创新之处。第2章相关理论总结和评述舆情分析、Python编程及网络爬虫相关理论。2.1舆情分析理论阐述舆情分析的基本概念、流程及关键技术。2.2Python编程基础介绍Python语言特点及其在数据分析中的应用。2.3网络爬虫技术说明网络爬虫的原理及在舆情数据收集中的应用。第3章系统设计详细描述基于Python的汽车之家网站舆情分析系统的设计方案。3.1系统架构设计给出系统的整体架构,包括数据收集、处理、分析及展示模块。3.2数据收集模块设计介绍如何利用网络爬虫技术收集汽车之家网站的舆情数据。3.3数据处理与分析模块设计阐述数据处理流程及舆情分析算法的选择与实现。第4章系统实现与测试介绍系统的实现过程及测试方法,确保系统稳定可靠。4.1系统实现环境列出系统实现所需的软件、硬件环境及开发工具。4.2系统实现过程详细描述系统各模块的实现步骤及代码实现细节。4.3系统测试方法介绍系统测试的方法、测试用例及测试结果分析。第5章研究结果与分析呈现系统运行结果,分析舆情数据,提出见解。5.1舆情数据可视化展示通过图表等形式展示舆情数据的分布、趋势等特征。5.2舆情分析结果解读对舆情分析结果进行解读,提出对汽车行业的见解。5.3对比方法分析将本系统与其他舆情分析系统进行对比,分析优劣。第6章结论与展望总结研究成果,提出未来研究方向。6.1研究结论概括本文的主要研究成果及对汽车之家网站舆情分析的贡献。6.2展望指出系统存在的不足及未来改进方向,展望舆情
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值