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 3
010
909
012
6 4
5237
2753
7523
5723
5327
2537
样例输出
3
2700
提示
第二组样例可以将原顺序(1,2,3,4)调整为(3,1,4,2),则第二个数字变为5237,第三个数字变为2537,分别为这样变换后的最大值和最小值,可以验证这样变换后的差值2700为最小差值。
题目链接:http://acm.hust.edu.cn/problem/show/1586
分析:直接k!的去枚举全排列,将所有列都重新排列,然后暴力处理出来每一行的新数字,再维护一个最大值一个最小值相减即可。

  数组a用来记录输入的字符串,数组b用来记位数,然后进行全排列,数组c用来装数组a全排列后的值,注意数组c要清零
要用到next_permutation全排列,自动生成下个序列!详细解释请参考我的博客!
下面附上AC代码:
 #include <bits/stdc++.h>
using namespace std;
char a[][];
int main()
{
int n,k;
while(cin>>n>>k)
{
int b[];
for(int i=;i<=n;i++)
cin>>a[i];
for(int i=;i<=k;i++)
b[i]=i;
int m=;
for(int i=;i<=k;i++)
m*=i;//直接求k!用m来装k全排列的可能性
int output=0x3f3f3f3f;
for(int i=;i<=m;i++)
{
next_permutation(b+,b++k);//全排列
int c[];
memset(c,,sizeof(c));
for(int i=;i<=n;i++)
{
for(int j=;j<=k;j++)
{
c[i]=c[i]*+a[i][b[j]-]-'';//数组c用来装数组a排列后的值
}
}
sort(c+,c++n);//排序,将数组c中的值进行升序排列
output=min(output,c[n]-c[]);//维护一个最大值一个最小值相减,求最小差值
}
cout<<output<<endl;
}
return ;
}

HUST 1586 数字排列的更多相关文章

  1. 蓝桥杯 - 数字排列(今有7对数字) - [两种不同的DFS思路]

    今有7对数字:两个1,两个2,两个3,...两个7,把它们排成一行.要求,两个1间有1个其它数字,两个2间有2个其它数字,以此类推,两个7之间有7个其它数字.如下就是一个符合要求的排列: 171264 ...

  2. 数字排列(n,m)(搜索与回溯)

    题目描述: 设有n个整数的集合{1,2,…,n},从中取出任意r个数进行排列(r<n),试列出所有的排列. 代码如下: #include<iostream>#include<c ...

  3. 用python实现0到9之间10个数字排列不重复的个数

      """ product 笛卡尔积 permutations 排列 combinations 组合,没有重复 combinations_with_replacement ...

  4. C语言_数字排列顺序

    #include <stdio.h> #include <stdlib.h> #define LENGTH 8 void main() { , , , , , , , }; ; ...

  5. HDU 1027(数字排列 STL)

    题意是求 n 个数在全排列中的第 m 个序列. 直接用 stl 中的 next_permutation(a, a+n) (这个函数是求一段序列的下一个序列的) 代码如下: #include <b ...

  6. [AcWing 51] 数字排列

    点击查看代码 class Solution { public: vector<vector<int>> res; vector<vector<int>> ...

  7. UVa 10905 - Children's Game(求多个正整数排列后,所得的新的数字的极值)

    4thIIUCInter-University Programming Contest, 2005 A Children’s Game Input: standard input Output: st ...

  8. (剑指Offer)面试题45:圆圈中最后剩下的数字

    题目: 0,1,...n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字,求出这个圆圈里剩下的最后一个数字. 思路: 1.环形链表模拟圆圈 创建一个n个节点的环形链表,然后每次在 ...

  9. 【以前的空间】bzoj 1072 [SCOI2007]排列perm

    又颓废了一个下午,最近撸mc撸到丧失意识了,玩的有点恶心,于是找水题做,瞧不起颓废的自己啊. another水题. 这题题意很明显啦,就是找数字排列后组成的数去mod d=0后有多少种. 普通的搜索的 ...

随机推荐

  1. (中等) HDU 1043 Eight,经典搜索问题。

    Problem Description The 15-puzzle has been around for over 100 years; even if you don't know it by t ...

  2. ubuntu apache2 ssl配置

    Ubuntu下HTTPS配置非常简单,对大部分用户而言,使用普通的自签名证书,只需按照步骤进行就可以了,无需了解密钥.证书的更多知识,更深的背景 知识还有RSA算法.DES算法.X509规范.CA机构 ...

  3. 关于Java通过JNI调用C 动态链接库(DLL)

    JNI介绍 用JNI实现Java和C语言的数据传递 JNI原理分析和详细步骤截图说明 jni的JNIEnv指针和jobject指针 JNI实现回调| JNI调用JAVA函数|参数和返回值的格式 Jni ...

  4. iOS自定义字体及类目 分类: ios技术 2015-05-15 16:34 195人阅读 评论(0) 收藏

    1:获取字体文件 从各种渠道下载字体文件ttf, 网站或者从别的ipa里扣出来.(以fzltxh.ttf为例) 2:将fzltxh.ttf文件拷贝到工程中 3:在Info.plist中添加项: Fon ...

  5. C# 计算文件的HASH

    /// <summary> /// 提供用于计算指定文件哈希值的方法 /// <example>例如计算文件的MD5值: /// <code> /// String ...

  6. Markdown及MarkdownPad使用规则

    Markdown Markdown 是一种轻量级标记语言.它允许人们"使用易读易写的纯文本格式编写文档,然后转换成有效的XHTML(或者HTML)文档". Markdown语法简要 ...

  7. UVa 10427 - Naughty Sleepy Boys

    题目大意:从1开始往后写数字,构成一个如下的字符串 123456789101112... .求第n位的数字是多少. 找规律,按数字的位数可以构建一个类似杨辉三角的东西,求出第n位是哪个数的第几位即可. ...

  8. [Angular Tutorial] 0-Bootstraping

    在这一节的tutorial中,您将会逐渐熟悉AngularJS phonecat app的最重要的源代码文件.您也将学到如何将开发服务器与angular-seed绑定到一起,并且在浏览器中运行应用. ...

  9. android TextView实现滚动显示效果

    在android中,如果设置了TextView控件为单行显示,且显示的文本太长的话,默认情况下会造成显示不全的情况,这种情况下我们需要设置该控件属性如下: <TextView android:i ...

  10. 2.3. 实体(Core Data 应用程序实践指南)

    Entity 实体,就像是数据表的映射类.用实体就可以创建托管对象了. 实体需要做的就是设置实体名称.实体属性及属性数据类型. 还可以根据实体配置NSManagedObject的子类(可选),创建子类 ...