标签:include 应该 选择 div desc clu 空格 代码 绝对值
Description - 题目描述
Input - 输入
Output - 输出
Sample Input - 输入样例
1 0 1 2 4 6 7
Sample Output - 输出样例
28
分析:
数字不重复,且是0-9之内的数字,而且若是差最小,那么拆分组成的两个数字的位数是相近的,比如九个数字,应该拆为4位数和5位数得到的差的绝对值才会是最小的,若是10个数字,则应该拆为两个
5位数字才有最小的差。因此可以分析出来时间复杂度是(10)!/((5)!*(5)!) * (5!) * (5!) = 252 *120 * 120 ,大概数量级为3600000,所以强行爆搜是不会超时的。
那么怎么爆搜呢?应该利用STL里面的一个函数进行将数字全排列,每次将排列的结果进行整合,将得到的数字进行相减,并将结果与当前最小值进行比较并更新最小值。
代码:
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
int main(){
int T;
scanf("%d ",&T);
while(T--){
char str[25]="0 1 2 4 6 7";
gets(str);
int values[15], len=0, ans=100000;
for(int i=0; str[i]; i++)
if(str[i]>=‘0‘ && str[i]<=‘9‘)
values[len++]=str[i]-‘0‘;
bool isDo = true;
if(len==2)
ans=abs(values[1] - values[0]);
else{
while(next_permutation(values, values + len)){
if(values[0] == 0 || values[len/2] == 0)
continue;
int num1 = 0, num2 = 0;
for(int i=0; i<len/2; i++)
num1 = num1*10 + values[i];
for(int i=len/2; i<len; i++)
num2 = num2*10 + values[i];
ans = ans<abs((num1-num2))?ans:abs((num1-num2));
}
}
cout<<ans<<endl;
}
return 0;
}
标签:include 应该 选择 div desc clu 空格 代码 绝对值
原文地址:http://www.cnblogs.com/huaixiaohai2015/p/6305987.html