题目链接:http://poj.org/problem?id=2718
题意:
将所给出的所有数字排列组合生成两个数,使其差的绝对值最小。求最小值。
这是一道穷竭搜索类型的题目,难度不大,还学到了 next_permutation 函数,
写好了一个代码后提交却是TLE!太搞人心态了,修改后有时报错,不得不说小白太辣鸡。。
这道题的坑就在于对输入数字为1和2特殊情况的单独列取
ac代码:
#include <iostream> #include <algorithm> #include <cstdio> int n,ids; int s[15]; char c; using namespace std; int make_num(int i,int j){ int x=0; for(int k=i;k<j;k++){ x*=10; x+=s[k]; } return x; } void solve(){ int ans=0x3f3f3f3f; int k=ids/2; do{ if(s[0]==0||s[k]==0) continue; int x=make_num(0,k); int y=make_num(k,ids); ans=min(ans,abs(x-y)); }while(next_permutation(s,s+ids)); printf("%d ",ans); } // using namespace std; int main(void){ scanf("%d ",&n); while(n--){ ids=0; while((c=getchar())!=' '){ if(c!=' ') s[ids++]=c-'0'; } if(ids==1) cout<<s[0]<<endl; else if(ids==2) cout<<abs(s[0]-s[1])<<endl; else{solve();} } // printf("%d ",ids); return 0; }
2020-03-22
18:34:00