首页 > 代码库 > HDU1755
HDU1755
这道题直接暴力枚举复杂度为 n!*m
但是k<100 , 所以我们可以通过取模用dp[i][j] 表示k=i 时,-x取模k为j的最小值
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 5 using namespace std; 6 7 int vis[10] , n , m , x , k , num[10] , dp[102][102]; 8 const int INF = 1000000000; 9 void dfs(int t , int state)10 {11 if(t >= n){12 for(int i=1 ; i<=100;i++)13 if(dp[i][state%i] > state)14 dp[i][state%i] = state;15 return;16 }17 for(int i=0;i<n;i++){18 if(!vis[i]){19 vis[i] = 1;20 dfs(t+1 , state*10+num[i]);21 vis[i] = 0;22 }23 }24 }25 26 int main()27 {28 // freopen("a.in","rb",stdin);29 //cout<<10*9*8*7*6*5*4*3*2*1<<endl;30 while(scanf("%d%d",&n,&m) == 2){31 for(int i=0;i<n;i++)32 scanf("%d",num+i);33 34 memset(vis,0,sizeof(vis));35 36 for(int i=0;i<=100;i++)37 for(int j=0;j<=100;j++) dp[i][j] = INF;38 39 for(int i=0;i<n;i++){40 if(num[i]){41 vis[i] = 1;42 dfs(1,num[i]);43 vis[i] = 0;44 }45 }46 for(int i=0;i<m;i++)47 {48 scanf("%d%d",&x,&k);49 if(dp[k][(((-x)%k)+k)%k] < INF)50 printf("%d\n",dp[k][(((-x)%k)+k)%k]); //state+x = b*k -> state%k = (-x)%k51 else puts("None");52 }53 }54 return 0;55 }
HDU1755
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。