贪心算法----最小差距
时间:2019-11-06
本文章向大家介绍贪心算法----最小差距,主要包括贪心算法----最小差距使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目描述
给定一些不同的一位数字,你可以从这些数字中选择若干个,并将它们按一定顺序排列,组成一个整数,把剩下的数字按一定顺序排列,组成另一个整数。组成的整数不能以0开头(除非这个整数只有1位)。
例如,给定6个数字,0,1,2,4,6,7,你可以用它们组成一对数10和2467,当然,还可以组成其他的很多对数,比如210和764,204和176。这些对数中两个数差的绝对值最小的是204和176,为28。
给定N个不同的0~9之间的数字,请你求出用这些数字组成的每对数中,差的绝对值最小的一对(或多对)数的绝对值是多少?
例如,给定6个数字,0,1,2,4,6,7,你可以用它们组成一对数10和2467,当然,还可以组成其他的很多对数,比如210和764,204和176。这些对数中两个数差的绝对值最小的是204和176,为28。
给定N个不同的0~9之间的数字,请你求出用这些数字组成的每对数中,差的绝对值最小的一对(或多对)数的绝对值是多少?
输入数据
第一行包括一个数T(T<=1000),为测试数据的组数。
每组数据包括两行,第一行为一个数N (2≤N≤10),表示数字的个数。下面一行为N个不同的一位数字。
输出数据
T行,每行一个数,表示第i个数据的答案。即最小的差的绝对值。
样例输入
2
6
0 1 2 4 6 7
4
1 6 3 4
样例输出
28
5
*****解决方案*****
【思路】 如果采用暴力穷举的方法,如果将N个数分为两组,两组中数字个数的差不超过1,这种情况下,时间复杂度为Cn n/2*(n/2)!*(n/2)!,时间复杂度比较大。
在此将问题分为几类:
(1) n=2:直接判断;
(2) n为奇数:将数字序列进行升序排序后,分别从头或者尾开始分配元素,将头元素分给第一组,将尾元素分给第二组,继而将下面的头元素分给第一组,下面的尾元素分给第二组....直到元素分配结束。
(3)n为偶数:枚举非零数字a[i]作为x的最高位,a[i+1]作为y的最高位,从右往左取k-1位加入x,从左往右取k-1位加入y,打擂台更新答案。(打擂台的意思即为,先选取一个擂主,继而挑战者上台挑战擂主,挑战成功便成为擂主,否则擂主守擂成功,然后下一个挑战者上台。。)
代码:
1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 int a[15]; 5 int n; 6 int abs(int x){ return (x<0?-x:x); } 7 int work1(){ 8 if (a[1]==0) swap(a[1],a[2]); 9 int s1=0,s2=0; 10 for (int i=1;i<=n/2+1;i++) s1=s1*10+a[i]; 11 for (int i=n;i>=n/2+2;i--) s2=s2*10+a[i]; 12 return abs(s1-s2); 13 } 14 int work2(){ 15 int book[15];//标志元素是否被使用过,使用过其值为1,否则为0 16 int s1,s2; 17 int ans=(1<<31)-1; 18 for (int i=2;i<=n;i++) 19 if (a[i-1]){ 20 s1=a[i],s2=a[i-1]; 21 memset(book,0,sizeof(book)); 22 book[i]=book[i-1]=1; 23 int l=1,r=n; 24 for (int j=1;j<=(n-2)/2;j++){//每一轮选出俩个数字 25 while (book[l]) l++; 26 while (book[r]) r--; 27 book[l]=book[r]=1; 28 /*for(int i = 1;i<15;i++) 29 printf("%d ",book[i]);*/ 30 s1=s1*10+a[l];s2=s2*10+a[r]; 31 32 }/* 33 printf("%d %d\n",s1, s2);*/ 34 ans=min(ans,abs(s1-s2)); 35 } 36 return ans; 37 } 38 int main(){ 39 int t; 40 cin>>t; 41 while (t--){ 42 scanf("%d",&n); 43 for (int i=1;i<=n;i++) scanf("%d",&a[i]); 44 sort(a+1,a+1+n); 45 if (n==2) { printf("%d\n",a[2]-a[1]);continue; } 46 if (n%2==1) printf("%d\n",work1()); else printf("%d\n",work2()); 47 } 48 }
原文地址:https://www.cnblogs.com/baixinyu/p/11808808.html
- LINQ驱动数据的查询功能
- JS魔法堂:jQuery.Deferred(jQuery1.5-2.1)源码剖析
- 一步一步学习Bootstrap系列--表单布局
- Java进阶01 String类
- linux(十二)之用户管理
- Dapper.Net 应用
- linux(十)配置ssh免密登录实现
- 微信群也有群相册功能了,终于可以给手机相册腾出空间了!
- PHP5.3、PHP5.4安装ZendOptimizer
- linux(十一)之初始化文件
- C编译: 动态连接库 (.so文件)
- 腾讯叮当首都发布生态合作伙伴计划,全面开放AI能力
- Python火爆的背后的应用领域是数据挖掘、大数据和人工智能的应用吗?
- linux(九)之网络基础
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PHP实现获取毫秒时间戳的方法【使用microtime()函数】
- 利用PHP如何统计Nginx日志的User Agent数据
- PHP树形结构tree类用法示例
- PHP PDOStatement::errorCode讲解
- Laravel框架搜索分页功能示例
- 解决Keras TensorFlow 混编中 trainable=False设置无效问题
- 浅谈keras中的后端backend及其相关函数(K.prod,K.cast)
- 使用 prometheus python 库编写自定义指标的方法(完整代码)
- PHP PDOStatement::fetchColumn讲解
- PHP PDOStatement::bindValue讲解
- PDO::lastInsertId讲解
- thinkPHP框架RBAC实现原理分析
- PHP PDOStatement::debugDumpParams讲解
- PDO::prepare讲解
- sklearn的predict_proba使用说明