C++用穷竭搜索解POJ2718 Smallest Difference问题——《挑战程序设计竞赛》

该博客介绍了如何解决一个算法问题,即给定一组0-9的数字,找出能组成两个数的组合,使得这两个数的差值最小。博主通过分析输入格式和样例,提出了一种暴力搜索的解题策略,利用C++的next_permutation函数进行全排列,然后比较所有可能的组合,找到最小差值。代码中,博主首先将输入的字符转换为数字,然后对每组数字进行全排列并计算差值,最终输出最小差值。

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

POJ2718 Smallest Difference

题目链接:
POJ2718 Smallest Difference

简单理解一下题目:
给定一些0-9中的数字,用这些数字组成两个数,求使得两个数之差最小的那种方案,输出两个数的差。

看一下输入:

1
0 1 2 4 6 7

输入的第一行表示有几个样例,接下来每一行就是一个样例,由于我们不知道每个样例有多少个数字,所以我用getchar()方法来输入。每输入一个字符就判断一下是不是换行符,如果是换行符就说明这个样例已经输入完毕,这里要注意的是,开头输入了一个样例总数之后需要用getchar()吞掉这个数字后面的换行符再开始输入样例。另外,存储的时候要记得把字符转换成数字,直接减去’0’字符即可

int cas;//样例总数
	cin >> cas;
	getchar();//吞掉cas后面的换行符
	for (int i = 0; i < cas; i++) {
		char c;
		int index = 0;
		while (true) {
			c = getchar();
			if (c == '\n')
				break;
			if(c!=' ')
				a[index++] = c-'0';
		}
		solve(index);
	}

解题思路:
solve()函数用于算出每个样例的结果,这题可以直接用暴力搜索,数组中的数字平均分成两份,搜索所有的情况,记录最小差值,这里用next_permutation()函数进行全排列,然后数组前半部分作为一个数字,后半部分作为一个数字。

AC代码:

#include<iostream>
#include<algorithm>

using namespace std;

char a[12];

void solve(int ind) {
	if (ind == 2) {
		cout << abs(a[0] - a[1]) << endl;
		return;
	}
	int res = 1e9;
	do {
		if (a[0] == 0 || a[ind / 2] == 0) {
			continue;
		}
		int front = 0;//记录前半部分数字
		int back = 0;//记录后半部分数字
		for (int i = 0; i < ind / 2; i++) {
			front *= 10;
			front += a[i];
		}
		for (int i = ind / 2; i < ind; i++) {
			back *= 10;
			back += a[i];
		}
		if (abs(front - back) < res)
			res = abs(front - back);
	} while (next_permutation(a, a + ind));
	cout << res << endl;
	return;
}

int main() {
	int cas;//样例总数
	cin >> cas;
	getchar();//吞掉cas后面的换行符
	for (int i = 0; i < cas; i++) {
		char c;
		int index = 0;
		while (true) {
			c = getchar();
			if (c == '\n')
				break;
			if(c!=' ')
				a[index++] = c-'0';
		}
		solve(index);
	}
	return 0;
}

/*
1
0 1 2 4 6 7
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值