poj之旅——2718
2016-05-08 19:27
295 查看
题目描述及题解:
题意:给出最多10个数字,将它们划分为两个整数,求差异值最小的值(除非只有一位数,否则不允许出现先导0)
题解:很显然如果总共有n个数,必然有一个整数长n/2,另一个长n-n/2,dfs搜一遍即可。
参考程序:
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
using namespace std;
const int INF=0x3f3f3f3f;
int a[12],b[12],N,n,ans;
bool vis[12];
void solve(int aa){
int len=0,bb=0;
for (int i=0;i<n;i++)
if (!vis[i])b[len++]=a[i],bb=bb*10+a[i];
if (b[0]!=0 || len==1) ans=min(ans,abs(aa-bb));
while (next_permutation(b,b+len)){
bb=0;
for (int i=0;i<len;i++)
bb=bb*10+b[i];
if (b[0]!=0 || len==1)
ans=min(ans,abs(aa-bb));
}
}
void dfs(int k,int res){
if (k==n/2){
solve(res);
return;
}
for(int i=0;i<n;i++){
if (!vis[i]){
if (a[i]==0 && k==0 && n>3)
continue;
vis[i]=true;
dfs(k+1,res*10+a[i]);
vis[i]=false;
}
}
}
int main(){
scanf("%d ",&N);
for (int i=0;i<N;i++){
n=0;char ch;
while ((ch = getchar()) != '\n'){
if (ch==' ')continue;
a[n++]=ch-'0';
}
ans=INF;
memset(vis,false,sizeof(vis));
dfs(0,0);
printf("%d\n",ans);
}
return 0;
}
题意:给出最多10个数字,将它们划分为两个整数,求差异值最小的值(除非只有一位数,否则不允许出现先导0)
题解:很显然如果总共有n个数,必然有一个整数长n/2,另一个长n-n/2,dfs搜一遍即可。
参考程序:
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
using namespace std;
const int INF=0x3f3f3f3f;
int a[12],b[12],N,n,ans;
bool vis[12];
void solve(int aa){
int len=0,bb=0;
for (int i=0;i<n;i++)
if (!vis[i])b[len++]=a[i],bb=bb*10+a[i];
if (b[0]!=0 || len==1) ans=min(ans,abs(aa-bb));
while (next_permutation(b,b+len)){
bb=0;
for (int i=0;i<len;i++)
bb=bb*10+b[i];
if (b[0]!=0 || len==1)
ans=min(ans,abs(aa-bb));
}
}
void dfs(int k,int res){
if (k==n/2){
solve(res);
return;
}
for(int i=0;i<n;i++){
if (!vis[i]){
if (a[i]==0 && k==0 && n>3)
continue;
vis[i]=true;
dfs(k+1,res*10+a[i]);
vis[i]=false;
}
}
}
int main(){
scanf("%d ",&N);
for (int i=0;i<N;i++){
n=0;char ch;
while ((ch = getchar()) != '\n'){
if (ch==' ')continue;
a[n++]=ch-'0';
}
ans=INF;
memset(vis,false,sizeof(vis));
dfs(0,0);
printf("%d\n",ans);
}
return 0;
}
相关文章推荐
- 如何在Code First、Database First和Model First之间选择
- 使用TryUpdateModel进行数据更新
- 对于over-posting的防御
- Asp.Net MVC源码调试
- ADO对象模型总结
- 关于javascript的原型对象的一些理解
- Hadoop 权威指南学习2 (Sqoop)
- 推送代码到GitHub上的两种方式
- 设计模式-单例模式(Singleton)在Android中的应用场景和实际使用遇到的问题
- Java 8 语言变化
- 线性时间内求最大子数组和
- *关于阿拉伯国家的UI适配问题
- PreApplicationStartMethod特性说明
- Bearer Token的加密解密规则(OAuth中间件)
- MAC 设置环境变量path的几种方法
- 我是一个线程(修订版)
- nyoj 747 蚂蚁的难题(三)
- MAC 设置环境变量path的几种方法
- 第十周学习进度
- 菜鸟C#学习笔记本