POJ 2718
2016-07-26 08:18
323 查看
题意:
对于一个数列,我们将数字分成两堆,求可能的情况下,两堆数字组成的数的差的最小值,排除前导0
题解:
将给出的数列进行字典序排列,然后将每个部分的转化成数字做差比较,因为字典序,所以枚举了所有数字
对于一个数列,我们将数字分成两堆,求可能的情况下,两堆数字组成的数的差的最小值,排除前导0
题解:
将给出的数列进行字典序排列,然后将每个部分的转化成数字做差比较,因为字典序,所以枚举了所有数字
#include<iostream> #include<stdio.h> #include<stdlib.h> #include<string.h> #include<queue> #define pr(x) cout<<#x<<" "<<x; #define pl(x) cout<<#x<<" "<<x<<endl; #include<math.h> #include<algorithm> #include<set> #include<map> #include<bitset> #include<string> using namespace std; int calnum(int str[],int eindex){ int a= 0; for(int i = 0 ;i<eindex;i++){ a = str[i]+a*10; } return a; } int main(){ int t; cin>>t; cin.ignore(); while(t--){ string s; getline(cin,s); s.erase(remove(s.begin(),s.end(),' '),s.end()); int length = s.size(); int nums[length]; for(int i = 0;i<length;i++){ nums[i] = s[i]-'0'; } int numa[length]; int numb[length]; int bendindex; int ans=0x7f7f7f7f; if(length%2==0){ bendindex = length/2; } else{ bendindex = length/2+1; } do{ for(int i = 0;i<length/2;i++){ numa[i] = nums[i]; } for(int i = length/2,j = 0;i<length;i++,j++){ numb[j] = nums[i]; } if((numa[0]==0&&length/2>1)|| (numb[0]==0&&bendindex>1) ){continue;} else{ int a = calnum(numa,length/2); int b = calnum(numb,bendindex); ans = min(ans,abs(a-b)); } }while(next_permutation(nums,nums+length)); cout<<ans<<endl; } }
相关文章推荐
- 初学ACM - 组合数学基础题目PKU 1833
- POJ ACM 1001
- POJ ACM 1002
- 1611:The Suspects
- POJ1089 区间合并
- POJ 2159 Ancient Cipher
- POJ 2635 The Embarrassed Cryptographe
- POJ 3292 Semi-prime H-numbers
- POJ 2773 HAPPY 2006
- POJ 3090 Visible Lattice Points
- POJ-2409-Let it Bead&&NYOJ-280-LK的项链
- POJ-1695-Magazine Delivery-dp
- POJ1523 SPF dfs
- POJ-1001 求高精度幂-大数乘法系列
- POJ-1003 Hangover
- POJ-1004 Financial Management
- [数论]poj2635__The Embarrassed Cryptographer
- [二分图匹配]poj2446__Chessboard
- POJ1050 最大子矩阵和
- 用单调栈解决最大连续矩形面积问题