枚举搜索+贪心:POJ2718--Smallest Difference(解一)
来源:互联网 发布:ubuntu 16.04 优麒麟 编辑:程序博客网 时间:2024/06/07 07:19
本题题意是把所给数分为两个非空集合,分别用这两个集合组成两个数,求组成数的最小绝对值。显然这是一条穷竭搜索的题目,不大于10个数暴力搜索似乎可以解决。既然要绝对值最小,那么两数的位数的绝对值也一定是最小的。所以自然会想到将数据分为奇数个和偶数个两种情况讨论。利用贪心的思想,当数据为奇数个时,取最小非零数为较大数的第一个数字。然后将剩下的偶数个数分为两组,将最小组合添加到较大数后面,最大组合作为较小数。当数据为偶数个时,利用贪心的思想,较大数和较小数的首位数字应该绝对值最小,所以应该挑选出绝对值最小的两个数,作为两数的首位数字。然后将剩下的偶数个数分为两组,将最小组合添加到较大数后面,最大组合添加到较小数后面。如果数据中绝对值最小的情况不止一种,那么还应该枚举出来,找最小者。原题链接
#include <iostream>#include <cmath>#include <cstring>using namespace std;int sum1,sum2,result;int state[10],used[10];void update(int k){ for(int j=0;j<(k-1)/2;j++) ///填充大数 for(int i=9;i>=0;i--) if(state[i]&&!used[i]){ sum1=sum1*10+i; used[i]=1; break; } for(int j=0;j<(k-1)/2;j++) ///填充小数 for(int i=0;i<10;i++) if(state[i]&&!used[i]){ sum2=sum2*10+i; used[i]=1; break; } result=min(result,sum2-sum1);}int main(){ int n; cin>>n; while(n--){ char c,s; int k=0; result=0x7f7f7f7f; memset(state,0,sizeof(state)); memset(used,0,sizeof(used)); while(cin>>skipws>>c>>noskipws>>s){ state[c-'0']=1; k++; if(s=='\n') break; } if(k&1){ ///如果输入的个数是奇数 for(int i=1;i<10;i++) if(state[i]){ sum1=0;sum2=i; used[i]=1; break; } update(k); } else{ int mm=9,tmp=-10; for(int i=1;i<10;i++) if(state[i]) {mm=min(mm,i-tmp);tmp=i;} for(int i=1;i<10-mm;i++) if(state[i]&&state[i+mm]) { sum1=i;sum2=i+mm; used[i]=used[i+mm]=1; update(k); memset(used,0,sizeof(used)); } if(mm==9) result=tmp; ///只有两个数且其中一个数为0 } cout<<result<<endl; } return 0;}
0 0
- 枚举搜索+贪心:POJ2718--Smallest Difference(解一)
- POJ2718 Smallest Difference 【贪心+枚举】
- 枚举库函数搜索:POJ2718--Smallest Difference(解二)
- poj2718 Smallest Difference【贪心】
- 【POJ2718】Smallest Difference(枚举排列)
- POJ2718-Smallest Difference-穷竭搜索
- Smallest Difference(Poj2718)(枚举全排列next_Permutation)
- 深度优先搜索(DFS):POJ2718--Smallest Difference(解三)
- POJ2718 Smallest Difference (暴力搜索+全排列)
- POJ2718(枚举 + 贪心)
- poj2718 Smallest Difference
- poj2718 Smallest Difference
- POJ2718---Smallest Difference
- [dfs]poj2718 Smallest Difference
- POJ2718-Smallest Difference
- Smallest Difference poj2718
- POJ2718 Smallest Difference
- POJ2718-Smallest Difference
- NDK支持的C++运行库
- POJ 3734 Blocks
- 如何理解java中的方法
- Spark On Yarn 详细配置流程
- 别以为真懂Openstack: 虚拟机创建的50个步骤和100个知识点(5)
- 枚举搜索+贪心:POJ2718--Smallest Difference(解一)
- 打了断点,但不进入debug视图
- 汇编语言
- "Spark 1.6 + Alluxio 1.2 + OFF_HEAP" 的配置
- 杭电1003——Max Sum
- Hdu-4734 F(x)(数位DP)
- SharedUserData
- 在使用eclipse 时不出现M标志的解决办法
- STL学习总结