试题 算法训练 粘木棍

超时一组,蓝桥杯只有90分

资源限制

内存限制: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 <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <numeric>
using namespace std;
int n, m;
int stick[10], stick_plus[10], state[10];
int min_long = 114514;


int measure()
{
    int min_=stick_plus[0], max_=stick_plus[0];
    for(int i=0; i<m; i++)
    {
        if(stick_plus[i] > max_)
            max_ = stick_plus[i];
        if(stick_plus[i] < min_)
            min_ = stick_plus[i];
    }
    return max_ - min_;
}


void dfs(int idx)
{
    int flag;
    if(idx == n)
    {
        flag = measure();
        if(flag < min_long)
            min_long = flag;
        return ;
    }

    for(int i=0; i<n; i++)
    {
        if(state[i]) continue;
        state[i] = 1;
        for(int j=0; j<m; j++)
        {
            stick_plus[j] += stick[i];
            dfs(idx + 1);

            stick_plus[j] -= stick[i];
        }
        state[i] = 0;
    }
    return ;
}


int main()
{
    cin>>n>>m;
    for(int i=0; i<n; i++)
        cin>>stick[i];
    dfs(0);
    cout<<min_long;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值