博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HUST 1586 数字排列
阅读量:6501 次
发布时间:2019-06-24

本文共 1586 字,大约阅读时间需要 5 分钟。

1586 - 数字排列

时间限制:1秒 内存限制:128兆

91 次提交 36 次通过
题目描述
现有n个k位的数字,你的任务是重新安排数字每一位的位置,使得重新安排后这n个数字中最大的数字和最小的数字之差的绝对值最小,对于每一位的调整是相对于所有的数字的,例如有3个数字1234、4321和7890,重新安排的方案是交换第二位和第三位,则3个数字变为1324、4231和7980。
输入
输入包括多组样例,每组样例包括多行。每组样例的第一行包括2个整数n和k,分别代表数字的个数和位数(1 ≤ n, k ≤ 8),接下来的的n行包括n个k位的数字,允许调整后的数字有前导0(例如000123代表123)。
输出
每组数据输出一个整数,为调整后最大数字与最小数字之间的最小差值。
样例输入
3 30109090126 4523727537523572353272537
样例输出
32700
提示
第二组样例可以将原顺序(1,2,3,4)调整为(3,1,4,2),则第二个数字变为5237,第三个数字变为2537,分别为这样变换后的最大值和最小值,可以验证这样变换后的差值2700为最小差值。
题目链接:
分析:直接k!的去枚举全排列,将所有列都重新排列,然后暴力处理出来每一行的新数字,再维护一个最大值一个最小值相减即可。
  数组a用来记录输入的字符串,数组b用来记位数,然后进行全排列,数组c用来装数组a全排列后的值,注意数组c要清零
要用到next_permutation全排列,自动生成下个序列!详细解释请参考我的博客!
下面附上AC代码:
1 #include 
2 using namespace std; 3 char a[10][10]; 4 int main() 5 { 6 int n,k; 7 while(cin>>n>>k) 8 { 9 int b[10];10 for(int i=1;i<=n;i++)11 cin>>a[i];12 for(int i=1;i<=k;i++)13 b[i]=i;14 int m=1;15 for(int i=1;i<=k;i++)16 m*=i;//直接求k!用m来装k全排列的可能性17 int output=0x3f3f3f3f;18 for(int i=1;i<=m;i++)19 {20 next_permutation(b+1,b+1+k);//全排列21 int c[10];22 memset(c,0,sizeof(c));23 for(int i=1;i<=n;i++)24 {25 for(int j=1;j<=k;j++)26 {27 c[i]=c[i]*10+a[i][b[j]-1]-'0';//数组c用来装数组a排列后的值28 }29 }30 sort(c+1,c+1+n);//排序,将数组c中的值进行升序排列31 output=min(output,c[n]-c[1]);//维护一个最大值一个最小值相减,求最小差值32 }33 cout<
<

 

转载地址:http://phtyo.baihongyu.com/

你可能感兴趣的文章
spring-data-elasticsearch 概述及入门(二)
查看>>
Solr启动和结束命令
查看>>
1.12 xshell密钥认证
查看>>
3.2 用户组管理
查看>>
VMware虚拟机出现“需要整合虚拟机磁盘”的解决方法
查看>>
ibatis 动态查询
查看>>
汇编语言之实验一
查看>>
git 调用 Beyond Compare
查看>>
SQL基础-->层次化查询(START BY ... CONNECT BY PRIOR)[转]
查看>>
android实现图片识别的几种方法
查看>>
mvc学习地址
查看>>
masonry 基本用法
查看>>
使用openssl创建自签名证书及部署到IIS教程
查看>>
Word产品需求文档,已经过时了【转】
查看>>
dtoj#4299. 图(graph)
查看>>
关于网站的一些js和css常见问题的记录
查看>>
zabbix-3.4 触发器
查看>>
换用代理IP的Webbrowser方法
查看>>
【视频编解码·学习笔记】7. 熵编码算法:基础知识 & 哈夫曼编码
查看>>
spark集群安装部署
查看>>