首页 > 编程语言 >试题 算法训练 粘木棍

试题 算法训练 粘木棍

时间:2024-02-20 14:25:02浏览次数:33  
标签:10 试题 int gcd long 算法 木棍 include define

问题描述

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

输入格式

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

输出格式

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

样例输入

3 2
10 20 40

样例输出

10

数据规模和约定

  N, M<=7

题解:从大到小排序,如果n==m的话,就直接输出最大值-最小值。否则的话,就先把a数组从大到小存到b数组里,然后一边对b排序,一边往b的最小值里填数,最后就是最大值-最小值

证明:三个数,a>b>c两个桶的话,肯定是b+c和a的情况是最好的,(比如a+b的话肯定比之前a和c的差距大,a+c的话肯定比之前a和b的差距大)也就是从大到小排序,把前m个放进m个桶里,然后后边的都比前m个桶里的数小,然后每读一个就放进最小的桶里,也就是两个最小的放一块,然后排序,然后重复操作。从大到小一个是因为要把小的放在后边然后依次往桶里放,一个是因为后边没放的也是从大到小排序的,把大的放进最小桶里,比小的放进最小桶里,大的放进更大桶里拉开的差距更小。

代码

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <stack>
//#include <bits/stdc++.h>
using namespace std;
//#define int long long
typedef long long ll;
#define mem(a, b) memset(a, b, sizeof(a))
#define PI acos(-1)
#define LLu unsigned long long
#define PLL pair<ll, ll>
#define PII pair<int, int>
#define xx first 
#define yy second 
#define endl '\n'
#define O_O ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int gcd(int a, int b) {return b ? gcd(b, a%b) : a; }
int lcm(int a, int b) {return a/gcd(a, b)*b;}
const int N = 1e6 + 10, INF = 0x3f3f3f3f, mod = 1e9 + 7;
const double eps = 1e-6;
int n, m, a[N], b[N];
int main()
{
	cin >> n >> m;
	for(int i = 1; i <= n; i ++) cin >> a[i];
	sort(a + 1, a + 1 + n, greater<int>());
	if(n == m)
	{
		cout << a[1] - a[n] << endl;
	}
	else
	{
		for(int i = 1; i <= m; i ++)
		{
			b[i] = a[i];
		}
		for(int i = m + 1; i <= n; i ++)
		{
			b[m] += a[i];
			sort(b + 1, b + 1 + m, greater<int>());
		}
		cout << b[1] - b[m] << endl;
	}
	return 0;
}

但是~这个有的数据可以hack掉,比如5 3 2 2 2 3 3 ,答案应该是0,但是这个代码只会输出2。

所以也可以用m进制爆搜来做

​
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <stack>
//#include <bits/stdc++.h>
using namespace std;
//#define int long long
typedef long long ll;
#define mem(a, b) memset(a, b, sizeof(a))
#define PI acos(-1)
#define LLu unsigned long long
#define PLL pair<ll, ll>
#define PII pair<int, int>
#define xx first 
#define yy second 
#define endl '\n'
#define O_O ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int gcd(int a, int b) {return b ? gcd(b, a%b) : a; }
int lcm(int a, int b) {return a/gcd(a, b)*b;}
const int N = 1e6 + 10, INF = 0x3f3f3f3f, mod = 1e9 + 7;
const double eps = 1e-6;
int n, m, a[N], b[10], c[10];
int main()
{
	cin >> n >> m;
	for(int i = 1; i <= n; i ++) cin >> a[i];
	int tot = 1;
	for(int i = 1; i <= n; i ++)
	{
		tot *= m;
	}
	int ans = INF;
	for(int i = 0; i < tot; i ++)
	{
		int x = i;
		int id = n;
		mem(c, 0);
		mem(b, 0);
		for(int j = 1; j <= n; j ++)
		{
			int t = x%m + 1;
			x /= m;
			c[id] = t;
			id --;
		}
		for(int j = 1; j <= n; j ++)
		{
			b[c[j]] += a[j];
		}
		vector<int>cnt;
		for(int j = 1; j <= m; j ++)
		{
			if(b[j])
				cnt.push_back(b[j]);
		}
		if(cnt.size() == m)
		{
			sort(b + 1, b + 1 + m);
			ans = min(ans, b[m] - b[1]);
		}
	}
	cout << ans << endl;
	return 0;
}

标签:10,试题,int,gcd,long,算法,木棍,include,define
From: https://www.cnblogs.com/shyyyy/p/18022964

相关文章

  • day30 回溯算法总结
     我的感悟:之前一直没看进去,理论篇。今天看了,收获很大。 我的笔记: 资料:卡尔回溯总结卡尔理论视频......
  • 互联网信息服务算法推荐管理规定 (全文学习)2022年01月04日 本规定自2022年3月1日起施
    互联网信息服务算法推荐管理规定第一章总则第一条 为了规范互联网信息服务算法推荐活动,弘扬社会主义核心价值观,维护国家安全和社会公共利益,保护公民、法人和其他组织的合法权益,促进互联网信息服务健康有序发展,根据《中华人民共和国网络安全法》、《中华人民共和国数据安全法......
  • Python计算两图相似性-哈希算法(Hash)
    1、简介aHash:平均值哈希。速度比较快,但是常常不太精确。pHash:感知哈希。精确度比较高,但是速度方面较差一些。dHash:差异值哈希。精确度较高,均值哈希算法、差值哈希算法和感知哈希算法都是值越小,相似度越高,取值为0-64,即汉明距离中,64位的hash值有多少不同。三直方图和单通道直方图......
  • 排序算法的定义与分类
    1.排序的定义对一序列对象根据某个关键字进行排序。2.常见的排序算法的分类有冒泡排序,选择排序,插入排序,希尔排序,归并排序,快速排序,堆排序,计数排序,桶排序和基数排序。3.常见的语术说明稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面;不稳定:如果a原本在b的前面,而a=b,排序......
  • 【算法】【动态规划】最小路径和
    1 题目给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:一个机器人每次只能向下或者向右移动一步。示例1:输入:grid=[[1,3,1],[1,5,1],[4,2,1]]输出:7解释:因为路径1→3→1→1→1的总和最小。示例2......
  • 测试面试题4-HTTP请求头中Content-Type的作用是什么?
    在HTTP请求头中,Content-Type是用来指示请求或响应中实体主体的媒体类型的字段。它告诉服务器或客户端实体主体的数据类型是什么,以便正确解析数据。以下是一些常见的Content-Type类型:text/plain:纯文本格式text/html:HTML格式application/json:JSON格式application/xml:XML......
  • 测试面试题3-解释什么是RESTful API?
    RESTfulAPI指的是基于REST架构风格设计的应用程序接口。REST(RepresentationalStateTransfer)是一种软件架构风格,它是一种设计风格而非标准。RESTful架构通常基于HTTP协议,提倡使用标准的HTTP方法(GET、POST、PUT、DELETE等)来实现资源的增删改查操作。RESTful架构的主要设......
  • 测试面试题2-HTTP常见的方法有哪些?
    HTTP常见的方法如下所示:GET:从服务器获取资源,常用于获取网页、图片、文本等静态内容。POST:向服务器提交数据,常用于提交表单、上传文件等。PUT:向服务器上传资源,用于创建或更新指定资源。DELETE:删除服务器上的指定资源。HEAD:获取资源的元数据,只返回响应头部,用于检查资源是否存......
  • 测试面试题1-HTTP常见的状态码有哪些?
    常见的状态码如下所示:2xx成功:200OK(请求成功)、201Created(已创建)、204NoContent(无内容)3xx重定向:301MovedPermanently(永久重定向)、302Found(临时重定向)、304NotModified(未修改)4xx客户端错误:400BadRequest(错误的请求)、401Unauthorized(未授权)、403Forbidden(禁止访问......
  • 基于EMD的滚动轴承故障诊断算法matlab仿真
    1.算法运行效果图预览 2.算法运行软件版本matlab2022a  3.算法理论概述       基于经验模态分解(EmpiricalModeDecomposition,EMD)的滚动轴承故障诊断算法是一种有效的非平稳信号处理方法,特别适用于处理非线性、非平稳的振动信号。该方法通过自适应地将复杂信......