Time Limit: 1000MS |
|
Memory Limit: 65536K |
Total Submissions: 6524 |
|
Accepted: 1777 |
Description
Input
Output
Sample Input
1
0 1 2 4 6 7
Sample Output
28
题意:给出一个集合,集合里是按升序排列的个位数,且不重复。用这些集合中的数组成两个数(集合中的每个数都只能用一次),求这两个数的最小差值是多少?
题解:分情况讨论一下:
1.当集合中的数有奇数个时,大的那个数多一位,要尽可能小,小的那个数要尽可能大。
2.当集合中的数有偶数个时,取中间两个个位数数分别为两个数的开头,开头大的那个数,后面要尽可能小,开头小的那个数,后面要尽可能大。
所以很明显,这一题是可以用贪心法解决的,模拟一下上面的思路即可,这里就不给出代码了。
觉得模拟很麻烦,就掏出了STL神器,暴力枚举所有符合要求的情况,记录下最小差值即可。
代码如下:
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; char str[30]; int num[15]; int main() { int t,len,i,k; scanf("%d",&t); getchar(); while(t--) { gets(str); len=strlen(str); k=0; for(i=0;i<len;++i) { if(str[i]>='0'&&str[i]<='9') num[k++]=str[i]-'0'; } if(k==2)//处理只有两个数的情况 { printf("%d\n",num[1]-num[0]); continue; } while(num[0]==0)//第一个数不能以零开头 next_permutation(num,num+k); int ans=999999999; do { int mid=(k+1)/2; if(num[mid])//第二个数不能以零开头 { int a=0,b=0; for(i=0;i<mid;++i) a=a*10+num[i]; for(i=mid;i<k;++i) b=b*10+num[i]; ans=min(ans,abs(a-b)); } }while(next_permutation(num,num+k)); printf("%d\n",ans); } return 0; }