zoukankan      html  css  js  c++  java
  • 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
    ",dp[k][(((-x)%k)+k)%k]); //state+x = b*k -> state%k = (-x)%k
    51             else puts("None");
    52         }
    53     }
    54     return 0;
    55 }
  • 相关阅读:
    Chrome调试中的奇技淫巧
    正则表达式学习记录
    探寻<a>中的href和onclick
    鼠标事件记录
    读取本地文件并进行处理
    浏览器兼容性问题汇总
    前端经验总结
    PL/sql使用总结
    正反斜杠的使用场景记录
    isEmpty和isBlank的区别
  • 原文地址:https://www.cnblogs.com/CSU3901130321/p/4060816.html
Copyright © 2011-2022 走看看