您的位置:首页 > Web前端

枚举库函数搜索:POJ2718--Smallest Difference(解二)

2016-08-16 00:24 447 查看
本题题意是把所给数分为两个非空集合,分别用这两个集合组成两个数,求组成数的最小绝对值。很快我们便能想到next_permutation()这个C++标准库函数。next_permutation(data,data+n)的功能把data[0]到data[n-1]的所有可能情况枚举出来。本题中,我们可以先将所有数字一一枚举,从中挑选出符合条件的分组做处理。原题链接

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;

int main(){
int n,sum1,sum2,result;
int data[10];
cin>>n;
while(n--){
char c,s;
int k=0;
result=0x7f7f7f7f;
memset(data,0,sizeof(data));
while(cin>>skipws>>c>>noskipws>>s){
data[k++]=c-'0';
if(s=='\n') break;
}
sort(data,data+k);
while(next_permutation(data,data+k)){    ///枚举数据的各种情况
int i;
sum1=sum2=0;
if(!data[k/2]&&k>2||!data[0]&&k>3) continue;    ///【重要】排除首位数为0的情况
for(i=0;i<k/2;i++) sum1=sum1*10+data[i];    ///计算第一个数
for(;i<k;i++) sum2=sum2*10+data[i];    ///计算第二个数
result=min(result,abs(sum1-sum2));    ///更新结果
}
cout<<result<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息