【poj 3373】Changing Digits 题意&题解&代码(C++)
来源:互联网 发布:amplitube 4 mac 破解 编辑:程序博客网 时间:2024/05/16 13:03
题目链接:
http://poj.org/problem?id=3373
题意:
给出2个整数n(n<10^100)和k(k<10000),求满足以下条件的整数m
1、m与n位数相同
2、m能被k整除
3、满足以上两点时,m和n在相同位置的地方,数字不同的个数最少
4、满足以上三点时,m值最小
题解:
记忆化搜索。
推荐:http://www.cnblogs.com/lyy289065406/archive/2011/08/18/2144764.html
代码:
#include<iostream>#include<algorithm>#include<stdio.h>#include<string.h>using namespace std;int len,n,k,a[100];int omo[110][110],dp[110][1005];char ss[110];int now[110];int dfs(int s,int pos,int m){ if (m==0) { for (int i=len-1;i>=0;i--) printf("%d",now[i]); printf("\n"); return 1; } if (s==0 || pos<0) return 0; if (s <= dp[pos][m]) return 0; for (int i=pos;i>=0;i--) { for (int j=0;j<now[i];j++) { if (i==len-1 && j==0) continue; int tmp=m-omo[i][now[i]]+omo[i][j]; tmp=(tmp%k+k)%k; int tmps=now[i]; now[i]=j; if (dfs(s-1,pos-1,tmp)) return 1; now[i]=tmps; } } for (int i=0;i<=pos;i++) { for (int j=now[i]+1;j<=9;j++) { if (i==len-1 && j==0) continue; int tmp=m-omo[i][now[i]]+omo[i][j]; tmp=(tmp%k+k)%k; int tmps=now[i]; now[i]=j; if (dfs(s-1,pos-1,tmp)) return 1; now[i]=tmps; } } dp[pos][m]=s;// cout<<"gg"<<endl; return 0;}int main(){ while(scanf("%s%d",ss,&k)!=EOF) { len=strlen(ss); //omo[i][j]=(10^i*j)%k; for (int i=0;i<=9;i++) omo[0][i]=i%k; for (int i=1;i<=len;i++) for (int j=0;j<=9;j++) omo[i][j]=(omo[i-1][j]*10)%k; int sum=0,j=0; for (int i=len-1;i>=0;i--)//统计ss%k的余数 { int x=ss[i]-'0'; sum+=omo[j][x]; sum%=k; j++; } for (int i=len-1,j=0;i>=0;i--,j++)//翻转 now[j]=ss[i]-'0'; memset(dp,0,sizeof(dp)); //类似于迭代加深的思路,修改次数从小到大枚举,能保证第3点 for (int i=0;i<=len;i++) { if (dfs(i,len-1,sum)) break; } }}
0 0
- 【poj 3373】Changing Digits 题意&题解&代码(C++)
- 【poj 2352】Stars 题意&题解&代码(C++)
- 【poj 1724】ROADS 题意&题解&代码(C++)
- 【poj 1925】Spiderman 题意&题解&代码(C++)
- 【poj 3368】Frequent values 题意&题解&代码(C++)
- 【poj 3321】Apple Tree 题意&题解&代码(C++)
- 【poj 1195】Mobile phones 题意&题解&代码(C++)
- 【poj 1703】Find them, Catch them 题意&题解&代码(C++)
- 【poj 2492】A Bug's Life 题意&题解&代码(C++)
- 【poj 2892】Tunnel Warfare 题意&题解&代码(C++)
- 【poj 1699】Best Sequence 题意&题解&代码(C++)
- 【poj 2331】Water pipe 题意&题解&代码(C++)
- 【poj 2286】The Rotation Game 题意&题解&代码(C++)
- 【poj 1691】Painting A Board 题意&题解&代码(C++)
- 【poj 1054】The Troublesome Frog 题意&题解&代码(C++)
- 【poj 3280】 Cheapest Palindrome 题意&题解&代码(C++)
- 【poj 2948】Martian Mining 题意&题解&代码(C++)
- 【poj 2411】Mondriaan's Dream 题意&题解&代码(C++)
- .net学习路线
- 分离式编译
- Android JNI入门
- 广播接收者常用的action
- 正则判断大于0的实数,整数位和小数位有长度限制
- 【poj 3373】Changing Digits 题意&题解&代码(C++)
- Android开发之MediaRecorder类详解
- 成为聪明程序员必备的5个技能
- java Struts+Hibernate企业人力资源管理系统源代码下载
- phpmyadmin没有接收到要导入的数据.可能是文件名没有提交,也可能是文件大小超出 PHP 限制.
- 学Java请不要做浮躁的人
- 判断一个二叉树是否对称
- java工厂设计模式
- MediaRecorder