HDU 1755 A Number Puzzle

64 篇文章 0 订阅
54 篇文章 0 订阅

 中文题我就不多解释题意了.

一开始是暴力枚举,每组数据的复杂度高达o(8!*2000),必然导致TLE...

but 看到这个(0<=x<10^9,0<K<100),应该是要从K入手了

DP[i][j] 表示在这8!种组合数中,mod i==j的数的最小值,这个可以使用DFS方便的枚举,于是对于每组数据,复杂度降到了o(8!*100)

然后对于输入的X,K,看DP[K][(K-X%K)%K]是否存在,若存在,输出,否则输出"None";查询基本上是o(1).

 

#include <iostream>
#include <algorithm>
using namespace std;
#define inf 111111111
short a[9];
bool
flag,hash[9];
int
X,K,N,Q;
int
DP[101][101];
void
dfs(int cnt,int val)
{

int
i,tmp;
if
(cnt==N)
{

for
(i=1;i<100;i++)
if
(val<DP[i][(tmp=val%i)])
DP[i][tmp]=val;
return
;
}

for
(i=0;i<N;i++)
{

if
(!hash[i])
{

if
(a[i]==0&&cnt==0)continue;
hash[i]=true;
dfs(cnt+1,10*val+a[i]);
hash[i]=false;
}
}
}

int
main()
{

int
i,j,tmp;
while
(scanf("%d%d",&N,&Q)!=EOF)
{

for
(i=0;i<N;i++)scanf("%d",&a[i]);
sort(a,a+N);
memset(hash,false,sizeof(hash));
for
(i=0;i<100;i++)for(j=0;j<100;j++)DP[i][j]=inf;
dfs(0,0);
while
(Q--)
{

scanf("%d%d",&X,&K);
tmp=(K-X%K)%K;
if
(DP[K][tmp]!=inf)
printf("%d/n",DP[K][tmp]);
else
puts("None");
}
}

return
0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值