HDU4474,POJ1465,HDU1226,URAL1495这些题目,首先是URAL1495,那天做这个第一个想法就是数位dp,但是没有推测出来,有段时间没做这个了,呃~然后采用了dfs的手法进行记忆化搜索,结果WA出翔了,搞了一下午,而后看了题解用数位DP解决了,但是也发现了一种比较稳妥的方法,比较清晰,而且网上刚好有个巨巨整理出了这一系列
可以戳这里 跳转
而后看了这位巨巨的大致方法做了一下URAL1495,学会了,然后又接下去做了这一个系列,这个方法很好很清晰,所以写下下来保存下来!
POJ1465:
HDU1226:
URAL1495:
可以戳这里 跳转
而后看了这位巨巨的大致方法做了一下URAL1495,学会了,然后又接下去做了这一个系列,这个方法很好很清晰,所以写下下来保存下来!
做这个系列期间也没有很利索的做完,比如POJ1465,当时我的队列是开在bfs里面的,结果就一直超时,最后随意试了一下才发觉的,交了我无数把啊,另外还有一些模0的问题需要注意,HDU1226稍微加了层迷雾,不过是进制转化罢了
typedef struct Node {
int num;
int mod;
int len;
};
bool vis[15];
int n,m;
int pre[10][10000 + 55][2];
queue<Node > q;
int Case = 0;
void init() {
memset(pre,-inf,sizeof(pre));
memset(vis,false,sizeof(vis));
}
bool input() {
while(cin>>n>>m) {
for(int i=0;i<m;i++) {
int x;
cin>>x;
vis[x] = true;
}
return false;
}
return true;
}
void dfs(int pos,int mod) {
if(pos == -1)return;
dfs(pre[pos][mod][0],pre[pos][mod][1]);
printf("%d",pos);
}
bool bfs() {
while(!q.empty())q.pop();
Node s,e;
for(int i=1;i<10;i++) {
if(!vis[i]) {
s.num = i;
s.mod = i%n;
s.len = 1;
pre[i][s.mod][0] = -1;
q.push(s);
}
}
while(!q.empty()) {
s = q.front();
q.pop();
if(s.mod == 0) {
dfs(s.num,s.mod);
return true;
}
for(int i=0;i<10;i++) {
if(!vis[i]) {
e.num = i;
e.mod = (s.mod * 10 + i)%n;
e.len = s.len + 1;
if(pre[e.num][e.mod][0] >= -1)continue;
pre[e.num][e.mod][0] = s.num;
pre[e.num][e.mod][1] = s.mod;
q.push(e);
}
}
}
return false;
}
void cal() {
printf("Case %d: ",++Case);
if(!bfs()){puts("-1");return;}
puts("");
}
void output() {
}
int main() {
while(true) {
init();
if(input())return 0;
cal();
output();
}
return 0;
}
POJ1465:
typedef struct Node {
int num;
int mod;
int len;
};
int nnum[100];
int n,m;
int pre[10][5500 + 55][2];
queue<Node > q;
void init() {
memset(pre,-inf,sizeof(pre));
}
bool input() {
while(cin>>n>>m) {
for(int i=0;i<m;i++)cin>>nnum[i];
return false;
}
return true;
}
void dfs(int pos,int mod) {
if(pos == -1)return;
dfs(pre[pos][mod][0],pre[pos][mod][1]);
printf("%d",pos);
}
bool bfs() {
while(!q.empty())q.pop();
Node s,e;
for(int i=0;i<m;i++) {
if(nnum[i]) {
s.num = nnum[i];
s.mod = nnum[i]%n;
s.len = 1;
pre[nnum[i]][s.mod][0] = -1;
q.push(s);
}
}
while(!q.empty()) {
s = q.front();
q.pop();
if(s.mod == 0) {
dfs(s.num,s.mod);
return true;
}
for(int i=0;i<m;i++) {
e.num = nnum[i];
e.mod = (s.mod * 10 + nnum[i])%n;
e.len = s.len + 1;
if(pre[e.num][e.mod][0] >= -1)continue;
pre[e.num][e.mod][0] = s.num;
pre[e.num][e.mod][1] = s.mod;
q.push(e);
}
}
return false;
}
void cal() {
if(n == 0){puts("0");return ;}
sort(nnum,nnum + m);
if(!bfs()){puts("0");return;}
puts("");
}
void output() {
}
int main() {
while(true) {
init();
if(input())return 0;
cal();
output();
}
return 0;
}
HDU1226:
typedef struct Node {
int num;
int mod;
int len;
};
bool vis[20 + 5];
int n,cc,m;
int pre[20 + 5][5000 + 55][2];
queue<Node > q;
int Case = 0;
void init() {
memset(pre,-inf,sizeof(pre));
memset(vis,false,sizeof(vis));
}
bool input() {
while(cin>>n>>cc>>m) {
char s[100000 + 5];
for(int i=0;i<m;i++) {
scanf("%s",s);
int len = strlen(s);
int tmp = 0;
for(int i=0;i<len;i++) {
if(s[i] >= '0' && s[i] <= '9')
tmp = tmp * 10 + s[i] - '0';
else
tmp = tmp * 10 + s[i] - 'A' + 10;
}
vis[tmp] = true;
}
return false;
}
return true;
}
void dfs(int pos,int mod) {
if(pos == -1)return;
dfs(pre[pos][mod][0],pre[pos][mod][1]);
if(pos < 10)printf("%d",pos);
else printf("%c",pos - 10 + 'A');
}
bool bfs() {
while(!q.empty())q.pop();
Node s,e;
for(int i=1;i<cc;i++) {
if(vis[i]) {
s.num = i;
s.mod = i%n;
s.len = 1;
pre[i][s.mod][0] = -1;
q.push(s);
}
}
while(!q.empty()) {
s = q.front();
q.pop();
if(s.len > 500)return false;
if(s.mod == 0) {
dfs(s.num,s.mod);
return true;
}
for(int i=0;i<cc;i++) {
if(vis[i]) {
e.num = i;
e.mod = (s.mod * cc + i)%n;
e.len = s.len + 1;
if(pre[e.num][e.mod][0] >= -1)continue;
//cout<<e.num<<e.mod<<"******"<<endl;
pre[e.num][e.mod][0] = s.num;
pre[e.num][e.mod][1] = s.mod;
q.push(e);
}
}
}
return false;
}
void cal() {
if(n == 0) {
if(vis[0])puts("0");
else puts("give me the bomb please");
return ;
}
if(!bfs()){puts("give me the bomb please");return ;}
puts("");
}
void output() {
}
int main() {
int t;
cin>>t;
while(t--) {
init();
if(input())return 0;
cal();
output();
}
return 0;
}
URAL1495:
int n;
typedef struct Node {
int len;
int digit;
int mod;
};
int pre[3][1000000 + 55][2];
void init() {
memset(pre,-inf,sizeof(pre));
}
bool input() {
while(cin>>n) {
return false;
}
return true;
}
void dfs(int digit,int mod) {
if(digit == -1)return ;
dfs(pre[digit][mod][0],pre[digit][mod][1]);
printf("%d",digit);
}
bool bfs() {
Node s,e;
queue<Node> q;
for(int i=1;i<=2;i++) {
s.digit = i;
s.mod = i%n;
s.len = 1;
pre[s.digit][s.mod][0] = -1;
q.push(s);
}
while(!q.empty()) {
s = q.front();
q.pop();
if(s.len > 30)return false;
if(s.mod == 0) {
dfs(s.digit,s.mod);
return true;
}
for(int i=1;i<=2;i++) {
e.digit = i;
e.len = s.len + 1;
e.mod = (s.mod * 10 + i)%n;
if(pre[e.digit][e.mod][0] >= -1)continue;
pre[e.digit][e.mod][0] = s.digit;
pre[e.digit][e.mod][1] = s.mod;
q.push(e);
}
}
return false;
}
void cal() {
if(n%10 == 0 || n%10 == 5) {puts("Impossible");return;}
if(!bfs()){puts("Impossible");return;}
puts("");
}
void output() {
}
int main() {
while(true) {
init();
if(input())return 0;
cal();
output();
}
return 0;
}