POJ 2718 Smallest Difference (穷竭搜索+剪枝+全排列生成)

该博客讨论了POJ 2718 Smallest Difference问题的解决方案,涉及穷竭搜索、剪枝策略和全排列生成。博主分析了如何枚举所有可能的数对组合,并提出针对首位为0的剪枝条件,以及对于偶数和奇数数量数字的不同处理策略,以减少计算量。同时,强调了在生成全排列前进行剪枝的重要性,并分享了使用打表进行调试的经验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:Smallest Difference POJ - 2718

给定若干位十进制数,你可以通过选择一个非空子集并以某种顺序构建一个数。剩余元素可以用相同规则构建第二个数。除非构造的数恰好为0,否则不能以0打头。 举例来说,给定数字0,1,2,4,6与7,你可以写出10和2467。当然写法多样:210和764,204和176,等等。最后一对数差的绝对值为28,实际上没有其他对拥有更小的差

Input:
输入第一行的数表示随后测试用例的数量。
对于每组测试用例,有一行至少两个不超过10的十进制数字。(十进制数字为0,1,…,9)每行输入中均无重复的数字。数字为升序给出,相隔恰好一个空格。
Output:
对于每组测试用例,输出一个以上述规则可获得的最小的差的绝对值在一行。
Sample Input - 输入样例
1
0 1 2 4 6 7
Sample Output - 输出样例
28

分析:

用getline先读入一行,再取出其中的数字,本题显然要枚举所有的可能,这个枚举过程可以等效为对这几个数全排列的枚举,虽然好像有c++里面的函数可以实现,这里姑且让我自己写一个,实际上也很简单:使用dfs框架,由于参数记录了当前已经填好了几个数,所以不用考虑撤销当前步骤去进行下一步,直接根据已经填了几个数填下一个数即可,填过的位置直接覆盖就好。直到填满所需的个数,就开始判断,如果要求差的绝对值的最小值,两个数的位数要么一样,要么就只相差1位,所以从中间断开比较大小即可。这里从数组里得到整数,可以像下面程序里面一位一位算,也可以对字符数组操作,使用atoi()(#include<cstdlib>),如果字符串使用string存储,就要使用string::c_str(),讲偏了。。。但是这样处理的话,8位以内速度都是很快的,九位十位就不行了,会超时,必须考虑剪枝。至于为什么会超时,需要注意10!=3628800,光是枚举全排列就有300万的情况,每一种情况在对应十几步的操作,就有可能摸到1亿的门槛了,更何况这只是一组数据。

考虑以下剪枝:

1.两个数的首位不能是0(有bug,如果只有两个数,其中之一是0,就不能剪这个枝,所以设定剪枝条件:数的个数>2)

2.如果数的个数是偶数,则设定第一个数的首位小于第二个数的首位,反正大于的话不过是重复计算;而且设定在数的个数>7的时候,首位差的绝对值必须为1

3.如果数的个数是奇数,则设定第一个数(偶数位)的首位大于第二个数的首位,只有这样才可以满足差的绝对值最小;而且设定在数的个数>7的时候,首位之差的绝对值必须>=7(这个下限要好好考虑啊,如果设定为8,则有反例:0 1 2 3 4 5 6 7 8和0 2 3 4 5 6 7 8 9,注意0不在首位)

4.剪枝1 2 3都要在完全生成全排列之前操作,不要再已经生成错误或没必要全排列之后再剪枝

其他感悟:

打表debug赛高!!!(打表的代码也保存在以下代码中)

代码:

#include<iostream>
#include<string>
#include<vector>
#include<cmath>
using namespace std;
string s;
vector<int> v;
int num=0,tem[15],sst=1<<30;
//int shu[]={0,1,2,3,4,5,6,7,8,9};
void dfs(int n){
	if(n==num){
		if(num%2==0){
			int x=tem[0],y=tem[num/2];
			if(num==10&&abs(x-y)>1&&x>y)return;
			for(int i=1;i<num/2;i++){
				x*=10;
				x+=tem[i];
			}
			for(int i=num/2+1;i<num;i++){
				y*=10;
				y+=tem[i];
			}
			if(abs(x-y)<sst)sst=abs(x-y);
			return;
		}
		if(num%2==1){
			int x=tem[0],y=tem[num/2];
			if(x<y)return;
			for(int i=1;i<num/2;i++){
				x*=10;
				x+=tem[i];
			}
			for(int i=num/2+1;i<num;i++){
				y*=10;
				y+=tem[i];
			}
			if(abs(x-y)<sst)sst=abs(x-y);
			return;
		} 
	}
	if(n>0&&num>2&&tem[0]==0)return;
	if(n>num/2&&num>2&&tem[num/2]==0)return;
	if(n>num/2){
		if(num%2==0){
			if(tem[0]>tem[num/2])return;
			if(num>7&&abs(tem[0]-tem[num/2])>1)return;
		}
		else{
			if(tem[0]<tem[num/2])return;
			if(num>7&&tem[0]-tem[num/2]<7)return;
		}
	}
	for(int i=0;i<v.size();i++){
		int ok=1;
		for(int j=0;j<n;j++){
			if(tem[j]==v[i])ok=0;
		}
		if(ok){
			tem[n]=v[i];
			dfs(n+1);
		}
	}
}
int main(){
	int n;
	cin>>n;
	getline(cin,s);
	while(n--){
		v.clear();
		sst=1<<30;
		num=0;
		getline(cin,s);
		for(int i=0;i<s.size();i++){
			if(s[i]!=' '){
				num++;
				v.push_back(s[i]-'0');
			}
		}
		/*for(int i=0;i<1024;i++){
			v.clear();num=0;sst=1<<30;
			for(int j=0;j<10;j++){
				if((i>>j)&1){
					v.push_back(shu[j]);
					num++;
				}
			}
			dfs(0);
			//if(sst!=1<<30)continue;
			for(int j=0;j<v.size();j++){
				cout<<v[j]<<' ';
			}
			cout<<":"<<sst<<endl;
		}*/
		dfs(0);
		cout<<sst<<endl;
	}
	return 0;
}

标题基于SpringBoot+Vue的学生交流互助平台研究AI更换标题第1章引言介绍学生交流互助平台的研究背景、意义、现状、方法与创新点。1.1研究背景与意义分析学生交流互助平台在当前教育环境下的需求及其重要性。1.2国内外研究现状综述国内外在学生交流互助平台方面的研究进展与实践应用。1.3研究方法与创新点概述本研究采用的方法论、技术路线及预期的创新成果。第2章相关理论阐述SpringBoot与Vue框架的理论基础及在学生交流互助平台中的应用。2.1SpringBoot框架概述介绍SpringBoot框架的核心思想、特点及优势。2.2Vue框架概述阐述Vue框架的基本原理、组件化开发思想及与前端的交互机制。2.3SpringBoot与Vue的整合应用探讨SpringBoot与Vue在学生交流互助平台中的整合方式及优势。第3章平台需求分析深入分析学生交流互助平台的功能需求、非功能需求及用户体验要求。3.1功能需求分析详细阐述平台的各项功能需求,如用户管理、信息交流、互助学习等。3.2非功能需求分析对平台的性能、安全性、可扩展性等非功能需求进行分析。3.3用户体验要求从用户角度出发,提出平台在易用性、美观性等方面的要求。第4章平台设计与实现具体描述学生交流互助平台的架构设计、功能实现及前后端交互细节。4.1平台架构设计给出平台的整体架构设计,包括前后端分离、微服务架构等思想的应用。4.2功能模块实现详细阐述各个功能模块的实现过程,如用户登录注册、信息发布与查看、在线交流等。4.3前后端交互细节介绍前后端数据交互的方式、接口设计及数据传输过程中的安全问题。第5章平台测试与优化对平台进行全面的测试,发现并解决潜在问题,同时进行优化以提高性能。5.1测试环境与方案介绍测试环境的搭建及所采用的测试方案,包括单元测试、集成测试等。5.2测试结果分析对测试结果进行详细分析,找出问题的根源并
内容概要:本文详细介绍了一个基于灰狼优化算法(GWO)优化的卷积双向长短期记忆神经网络(CNN-BiLSTM)融合注意力机制的多变量多步时间序列预测项目。该项目旨在解决传统时序预测方法难以捕捉非线性、复杂时序依赖关系的问题,通过融合CNN的空间特征提取、BiLSTM的时序建模能力及注意力机制的动态权重调节能力,实现对多变量多步时间序列的精准预测。项目不仅涵盖了数据预处理、模型构建与训练、性能评估,还包括了GUI界面的设计与实现。此外,文章还讨论了模型的部署、应用领域及其未来改进方向。 适合人群:具备一定编程基础,特别是对深度学习、时间序列预测及优化算法有一定了解的研发人员和数据科学家。 使用场景及目标:①用于智能电网负荷预测、金融市场多资产价格预测、环境气象多参数预报、智能制造设备状态监测与预测维护、交通流量预测与智慧交通管理、医疗健康多指标预测等领域;②提升多变量多步时间序列预测精度,优化资源调度和风险管控;③实现自动化超参数优化,降低人工调参成本,提高模型训练效率;④增强模型对复杂时序数据特征的学习能力,促进智能决策支持应用。 阅读建议:此资源不仅提供了详细的代码实现和模型架构解析,还深入探讨了模型优化和实际应用中的挑战与解决方案。因此,在学习过程中,建议结合理论与实践,逐步理解各个模块的功能和实现细节,并尝试在自己的项目中应用这些技术和方法。同时,注意数据预处理的重要性,合理设置模型参数与网络结构,控制多步预测误差传播,防范过拟合,规划计算资源与训练时间,关注模型的可解释性和透明度,以及持续更新与迭代模型,以适应数据分布的变化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值