您的位置:首页 > Web前端

poj 2718 Smallest Difference 穷竭搜索之全排列

2017-09-25 11:43 344 查看
    很久没有做搜索的题目了,一拿过题竟然还有点手生,去网上看了题解,学到了不少关于string这个类的简便用法,但是也确实慢,看到许多题解都在写用DFS和贪心求解,但是觉得实在太费事了,不想那么大费周章,想改一改优化优化看看全排列能不能过,没想到全排列竟然过了,确实有点水,不过也复习了一下全排列的用法,学了就忘


  

关于String的许多简单用法:

/*
删除字符串中某一个特定的字符
s.erase(remove(s.begin(), s.end(), ' '), a.end()); //remove函数的作用基本上就是移动,将所有等于 ‘ ’的元素
移动到后面,然后返货第一个等于‘ ’的位置,然后再用erase函数直接删除这个区间内所有的元素,就OK了
s.substr(a, len); //表示从a开始,向后删除len个元素
s.substr(cur); //表示从cur开始删除,直到最后
*/

ACcode:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cstdlib>
#include<cmath>
using namespace std;
const int INF = 0x3f3f3f3f;
int A[10];
int n;

void solve()
{
int ans = INF;
do{
if(A[0] == 0 || A[n/2] == 0)
continue;
int num1 = 0;
for(int i = 0; i < n/2; i++)
num1 = num1*10 + A[i];
int num2 = 0;
for(int i = n/2; i < n; i++)
num2 = num2 * 10 + A[i];
ans = min(ans , abs(num1-num2));
}while(next_permutation(A, A+n));
cout << ans << endl;
return ;
}

int main()
{
int T;
std::ios::sync_with_stdio(false);
scanf("%d", &T);
getchar();
while(T--)
{
fill(A, A+10, INF);
//getchar();
char ch;
int i = 0;
while(ch = getchar())
{
if(ch == '\n')
break;
if(ch >= '0' && ch <= '9')
{
A[i] = ch - '0';
i++;
}
}
n = i;
if(i == 1)
cout << A[0] << endl;
else if(i == 2)
cout << abs(A[0]-A[1]) << endl;
else
solve();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: