• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            A Za, A Za, Fighting...

            堅(jiān)信:勤能補(bǔ)拙

            PKU 3373 Changing Digits

            問(wèn)題:
            http://acm.pku.edu.cn/JudgeOnline/problem?id=3373

            參考:
            http://blog.csdn.net/logic_nut/archive/2009/10/29/4740951.aspx
            http://iaml.is-programmer.com/posts/8249.html (這個(gè)應(yīng)該是SYSU的哈哈,里面有西西里)

            思路:
            這個(gè)題是真不會(huì)做,即使是看別人代碼都看了快兩天,艾...

            首先要解決的問(wèn)題是如何求大數(shù)的模(這里大數(shù)用字符串表示)?
            我們知道對(duì)于取模運(yùn)算有: (a+b)%k = ((a%k)+(b%k))%k
                                                 (ab)%k = ((a%k)(b%k))%k
            對(duì)于0-9的每個(gè)數(shù),可以將其在個(gè)、十、百、千...位時(shí)模k的結(jié)果保存到一張表中: mod_arr
            這樣,修改這個(gè)大數(shù)的任何一位而模k的新結(jié)果可以在O(1)時(shí)間內(nèi)取得 
             1 char num[MAX_LEN];
             2 int hash[MAX_MOD];
             3 int mod_arr[MAX_LEN][10];
             4 int k, len, tmp[MAX_LEN], tmp2[MAX_LEN], start_mod;
             5 int head, tail;
             6 struct EACH {
             7     int digits[MAX_LEN];
             8     int remainder;
             9     int index;
            10 } queue[MAX_MOD];
            11 
            12 void
            13 init()
            14 {
            15     int i, j;
            16     len = strlen(num);
            17     for(j=0; j<10; j++)
            18         mod_arr[0][j] = j%k;
            19     for(i=1; i<len; i++)
            20         for(j=0; j<10; j++)
            21             mod_arr[i][j] = (mod_arr[i-1][j]*10)%k;
            22     start_mod = 0;
            23     for(i=0; i<len; i++) {
            24         tmp[i] = tmp2[i] = num[len-i-1]-'0';
            25         start_mod += (mod_arr[i][num[len-i-1]-'0']);
            26     }
            27     start_mod %= k;
            28     head = -1;
            29     tail = 0;
            30     memset(hash, 0sizeof(hash));
            31     memset(queue, 0sizeof(queue));
            32 }

            第一篇參考鏈接里是用DFS來(lái)做的,可惜我對(duì)于其中用于記憶化搜索的remember數(shù)組始終不理解,結(jié)果TLE
            更加容易理解的方案是BFS,每次擴(kuò)展改變一位數(shù)字
            使用BFS的問(wèn)題是如何判重?參考第二篇文章(繁瑣的C++語(yǔ)法,沒(méi)認(rèn)真看呵呵),使用余數(shù)判重,其實(shí)還不是太理解

            代碼:
             1 void
             2 bfs()
             3 {
             4     int i, j, t, cur_rem, cur_index;
             5     queue[tail].remainder = start_mod;
             6     memcpy(queue[tail].digits, tmp, sizeof(int)*len);
             7     queue[tail].index = len-1;
             8     hash[start_mod] = 1;
             9     while(head < tail) {
            10         ++head;
            11         cur_rem = queue[head].remainder;
            12         cur_index = queue[head].index;
            13         memcpy(tmp, queue[head].digits, sizeof(int)*len);
            14         if(cur_rem == 0) {
            15             for(i=len-1; i>=0; i--)
            16                 printf("%d", tmp[i]);
            17             printf("\n");
            18             return;
            19         }
            20         /* changing digits: from least (smaller than itself) */
            21         for(i=cur_index; i>=0; i--) {
            22             for(j=0; j<tmp2[i]; j++) {
            23                 if(i==len-1 && j==0)
            24                     continue;
            25                 t = cur_rem + mod_arr[i][j] - mod_arr[i][tmp2[i]] + k; /* O(1) to find the new remainder */
            26                 t = t % k;
            27                 tmp[i] = j;
            28                 if(!hash[t]) {
            29                     ++tail;
            30                     queue[tail].remainder = t;
            31                     queue[tail].index = i-1;
            32                     memcpy(queue[tail].digits, tmp, sizeof(int)*len);
            33                     hash[t] = 1;
            34                 }
            35             }
            36             tmp[i] = tmp2[i];
            37         }
            38         /* changing digits: to max (greater than itself) */
            39         for(i=0; i<=cur_index; i++) {
            40             for(j=tmp2[i]+1; j<10; j++) {
            41                 t = cur_rem + mod_arr[i][j] - mod_arr[i][tmp2[i]] + k;
            42                 t = t % k;
            43                 tmp[i] = j;
            44                 if(!hash[t]) {
            45                     ++tail;
            46                     queue[tail].remainder = t;
            47                     queue[tail].index = i-1;
            48                     memcpy(queue[tail].digits, tmp, sizeof(int)*len);
            49                     hash[t] = 1;
            50                 }
            51                 tmp[i] = tmp2[i];
            52             }
            53         }
            54     }
            55 }

            posted on 2010-08-02 12:46 simplyzhao 閱讀(272) 評(píng)論(0)  編輯 收藏 引用 所屬分類: B_搜索

            導(dǎo)航

            <2011年9月>
            28293031123
            45678910
            11121314151617
            18192021222324
            2526272829301
            2345678

            統(tǒng)計(jì)

            常用鏈接

            留言簿(1)

            隨筆分類

            隨筆檔案

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            午夜久久久久久禁播电影| 欧美综合天天夜夜久久| 久久精品亚洲AV久久久无码| 久久无码人妻一区二区三区午夜| 久久综合九色综合97_久久久| 久久久精品国产亚洲成人满18免费网站| 亚洲欧洲精品成人久久奇米网| 亚洲欧美伊人久久综合一区二区 | 99热成人精品热久久669| 青草影院天堂男人久久| 久久精品中文无码资源站| 99久久伊人精品综合观看| 色狠狠久久AV五月综合| 久久国产精品一区| 99精品国产在热久久无毒不卡| 亚洲国产精品成人久久蜜臀| 久久国产精品久久精品国产| 久久99久久99精品免视看动漫| 国产三级精品久久| 97精品久久天干天天天按摩| 久久久久久精品成人免费图片| 久久久久久久久久免免费精品| 国产欧美久久一区二区| 亚洲伊人久久精品影院| 欧美久久久久久| 欧美无乱码久久久免费午夜一区二区三区中文字幕 | 亚洲国产美女精品久久久久∴| 久久本道综合久久伊人| 久久最近最新中文字幕大全| 国产午夜免费高清久久影院| 久久国产劲爆AV内射—百度| 亚洲精品无码久久久| 久久久黄片| 伊人色综合久久天天人守人婷| 久久久久久A亚洲欧洲AV冫| 国产精品成人99久久久久 | 久久亚洲天堂| 久久影视综合亚洲| 日本欧美国产精品第一页久久| 欧美久久久久久午夜精品| 久久精品国产福利国产琪琪|