蓝桥杯练习系统(算法训练)ALGO-997 粘木棍

文章介绍了如何使用深度优先搜索(DFS)算法解决将N根木棍粘成M个长木棍的问题,目标是使最长和最短木棍之间的差距最小。代码展示了如何遍历并动态调整木棍组合以找到最佳解决方案。
摘要由CSDN通过智能技术生成

资源限制

内存限制:256.0MB   C/C++时间限制:1.0s   Java时间限制:3.0s   Python时间限制:5.0s

问题描述

  有N根木棍,需要将其粘贴成M个长木棍,使得最长的和最短的的差距最小。

输入格式

  第一行两个整数N,M。
  一行N个整数,表示木棍的长度。

输出格式

  一行一个整数,表示最小的差距

样例输入

3 2
10 20 40

样例输出

10

数据规模和约定

  N, M<=7

#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
const int N=10;
int n,m;
int a[N],d[N];//d[j]为第j根粘起来的大木棍长度 
int w=0x3f3f3f3f;
bool st[N];

void dfs(int u){
	if(u==n){
		int d_min,d_max;
		d_min=*min_element(d,d+m);
		d_max=*max_element(d,d+m);
		w=min(w,d_max-d_min);
		return;
	}
	for(int i=u;i<n;i++){//将第i个小木棍粘到第j个大木棍上 
		if(!st[i]){
			st[i]=true;
			for(int j=0;j<m;j++){//粘到第j个大木棍上 
				d[j]+=a[i];
				dfs(u+1);
				d[j]-=a[i];
			}
			st[i]=false;
		}
	}
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=0;i<n;i++){
		scanf("%d",&a[i]);
	}
	dfs(0);
	printf("%d\n",w);
	return 0;
}

思路:dfs。从第1个小木棍开始,依次将其粘到m个大木棍上,如果粘上后差距最小则返回,反之则将这个木棍拿走,不粘上去。

注意:for循环中,i从u开始(前面的u-1个小木棍已经尝试着粘过):

for(int i=u;i<n;i++){//将第i个小木棍粘到第j个大木棍上 
		if(!st[i]){
			st[i]=true;
			for(int j=0;j<m;j++){//粘到第j个大木棍上 
				d[j]+=a[i];
				dfs(u+1);
				d[j]-=a[i];
			}
			st[i]=false;
		}
	}

如果i从0开始,运行可能会超时。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值