标签:set 题解 www logs pre 绝对值 进制 clu get
直接写中文了
Descriptions:
Input
Output
Sample Input
1 0 1 2 4 6 7
Sample Output
28
题目链接:
https://vjudge.net/problem/POJ-2718
先说题意
给你几个数字,可以分成两个子集,然后分别按一定顺序排列组成一个数,求出这两只值差的绝对值的最小值。设为n1,n2为两个新产生的数,那么n1,n2的位数越接近,其差的绝对值肯定越小
再者是排列了 题目说按一定顺序排列,那么这时候就可以用一个函数了(next_permutation(num,num+len))全排列函数 不会的可以参考 https://www.cnblogs.com/sky-stars/p/10948384.html 讲的很细
这两个问题解决就好写了
AC代码:
#include <iostream> #include <cstdio> #include <fstream> #include <algorithm> #include <cmath> #include <deque> #include <vector> #include <queue> #include <string> #include <cstring> #include <map> #include <stack> #include <set> #include <sstream> #define mod 1000000007 #define eps 1e-6 #define ll long long #define INF 0x3f3f3f3f #define MEM(x,y) memset(x,y,sizeof(x)) #define Maxn 1005 using namespace std; int num[Maxn]; int n,len;//测试样例 数组长度 int ans; void solve() { while(n--) { len=0;//每次归0 char ch; while(1) { scanf("%d%c",&num[len ++],&ch);//输入数据 if (ch==‘\n‘)//回车停止输入 break; } if (len == 2)//就两个数 { cout<<abs(num[0] - num[1])<<endl; continue; } int n1,n2;//两个重新组成的数 ans=INF; int mid=len/2;//求最小值 肯定是数字位数越接近越小啦 do { n1=num[0],n2=num[mid]; if(n1==0||n2==0) continue; for(int i=1; i<mid; i++)//第一个重组数 n1=n1*10+num[i]; for(int i=mid+1; i<len; i++)//第二个重组数 n2=n2*10+num[i]; ans=min(ans,abs(n1-n2));//找最小值 } while(next_permutation(num,num+len));//全排列 cout<<ans<<endl; } } int main() { cin>>n; solve(); }
【POJ - 2718】Smallest Difference(搜索 )
标签:set 题解 www logs pre 绝对值 进制 clu get
原文地址:https://www.cnblogs.com/sky-stars/p/11191522.html