• <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>

            POJ百練 - 2818:密碼

            鏈接:http://poj.grids.cn/practice/2818
            這其實就是一個簡單的移位密碼算法題,只是多了個循環而已,密碼學里面也指出過循環運算是沒有效果的,所以題目估計也就考察了這一點,如果沒有找出循環周期,此題會一直超時的...
            剛開始,我就直接模擬K次加密,顯然超時了,當時還不信了,以為簡單至此。。。
            后面我就開始改進了,剛開始是把周期計算和加密放在一起寫了,樣例也過了,但是還是一直錯...
            沒辦法再改,我改成把周期求出來,再對加密次數K取模后,再進行運算...
            好吧,還是一樣wa,后面就變成PE了。。。
            最后,這個題經過我近2個小時的奮戰,終于過了,一共錯了近10次吧...第一次提交是距現在1個多小時前了...
            最后發現錯誤的原因還是換行輸出的地方錯了,題目要求是每一組中間有個空行,我則輸出的是每次計算后有個空行...
            實在無語...
            思維不嚴謹啊...

            代碼:
            #include <stdio.h>
            #include <string.h>
            #define N_MAX 200 + 10
            int main()
            {
                int nN = 0;
                int nNArr[N_MAX];//密鑰
                int nK = 0;
                char szMsg[N_MAX];
                char szMsgBckup[N_MAX];//字符串備份
                int nCir[N_MAX];//周期
                int nMsgLen = 0;
                int nPos = 0;
                int i, j;
                
                while (scanf("%d", &nN), nN != 0)
                {
                    for (i = 1; i <= nN; ++i)
                    {
                        scanf("%d", &nNArr[i]);
                    }
                    
                    for (i = 1; i <= nN; ++i)//計算周期
                    {
                        nPos = i;
                        for (j = 1; ; ++j)
                        {
                            nPos = nNArr[nPos];
                            if (nPos == i)
                            {
                                nCir[i] = j;
                                break;
                            }
                        }
                    }
                    
                    while (scanf("%d", &nK), nK != 0)
                    {
                        getchar();//銷掉空格
                        gets(szMsg + 1);
                        nMsgLen = strlen(szMsg + 1);
                        for (i = nMsgLen; i < nN; ++i)
                        {
                            szMsg[1 + i] = ' ';
                        }
                        szMsg[1 + nN] = '\0';
                        strcpy(szMsgBckup + 1, szMsg + 1);
                        
                        for (i = 1; i <= nN; ++i)
                        {
                            nPos = i;
                            int nTimes = nK % nCir[i];
                            for (j = 1; j <= nTimes; ++j)
                            {
                                nPos = nNArr[nPos];
                            }
                            szMsg[nPos] = szMsgBckup[i];
                        }
                        
                        printf("%s\n", szMsg + 1);
                    }
                    printf("\n");
                }
                
                return 0;
            }

            posted @ 2011-11-10 20:56 yx 閱讀(2321) | 評論 (4)編輯 收藏

            POJ百練 - 1017:裝箱問題

            鏈接:http://poj.grids.cn/practice/1017

            說實話
            這就是個簡單的裝箱子問題,很容易想清楚裝箱子的過程,而且這個過程是滿足貪心算法的,
            所以只需要用代碼模擬整個裝箱子的過程即可,但是這樣真的就足夠了嗎???
            我剛開始就是用代碼模擬這個手動過程了,雖然AC了,但是代碼有150行左右,邏輯也顯得過于復雜了,
            得不償失。。。整個過程是6*6的一個占一個箱子,5*5的也必須一個占一個箱子,但是需要補11個1*1的,
            4*4的也是一個占一個箱子,但是需要補5個2*2的,如果2*2的不足夠,則用1*1的代替,
            3*3的4個占一個箱子,但是會有余數,可能余下1,2,3個3*3的箱子,這個時候必須非情況考慮,
            1個3*3的需要和5個2*2的,7個1*1的組合,2個3*3的需要和3個2*2的,6個1*1的組合,
            3個3*3的需要和1個2*2的,5個1*1的組合,最后考慮9個2*2的裝一個箱子,多余的2*2用1*1的去填充盡量擠滿一個箱子,
            最后36個1*1的裝一個箱子,余下的1*1的也必須占一個箱子。。。
            這個過程說出來已經非常復雜了,更何況用代碼寫,我費了九牛二虎之力才寫出來,WA了一次才AC了...

            代碼:
            #include <stdio.h>
            int main()
            {
                int one, two, three, four, five, six;
                int num = 0;
                
                while (scanf("%d%d%d%d%d%d", &one, &two, &three, &four, &five, &six) == 6)
                {
                    if (one == 0 && two == 0 && three == 0 && four == 0 && five == 0 && six == 0)
                    {
                        break;
                    }
                    
                    num = six;
                    num += five;
                    if (one > five * 11)
                    {
                        one -= five * 11;
                    }
                    else
                    {
                        one = 0;
                    }
                    
                    num += four;
                    if (two > four * 5)
                    {
                        two -= four * 5;
                    }
                    else
                    {
                        if (one > four * 5 * 4 - two * 4)
                        {
                            one -= four * 5 * 4 - two * 4;
                        }
                        else
                        {
                            one = 0;
                        }
                        two = 0;
                    }
                    
                    num += three / 4;
                    three = three % 4;
                    if (three == 1)
                    {
                        if (two > 5)
                        {
                            two -= 5;
                            if (one > 7)
                            {
                                one -= 7;
                            }
                            else
                            {
                                one = 0;
                            }
                        }
                        else
                        {
                            if (one > 27 - two * 4)
                            {
                                one -= 27 - two * 4;
                            }
                            else
                            {
                                one = 0;
                            }
                            two = 0;
                        }
                        ++num;
                    }
                    
                    if (three == 2)
                    {
                        if (two > 3)
                        {
                            two -= 3;
                            if (one > 6)
                            {
                                one -= 6;
                            }
                            else
                            {
                                one = 0;
                            }
                        }
                        else
                        {
                            if (one > 18 - two * 4)
                            {
                                one -= 18 - two * 4;
                            }
                            else
                            {
                                one = 0;
                            }
                            two = 0;
                        }
                        ++num;
                    }
                    
                    if (three == 3)
                    {
                        if (two > 1)
                        {
                            two -= 1;
                            if (one > 5)
                            {
                                one -= 5;
                            }
                            else
                            {
                                one = 0;
                            }
                        }
                        else
                        {
                            if (one > 9 - two * 4)
                            {
                                one -= 9 - two * 4;
                            }
                            else
                            {
                                one = 0;
                            }
                            two = 0;
                        }
                        ++num;
                    }
                    
                    num += two / 9;
                    two = two % 9;
                    if (two)
                    {
                        if (one > 36 - two * 4)
                        {
                            one -= 36 - two * 4;
                        }
                        else
                        {
                            one = 0;
                        }
                        ++num;
                    }
                    
                    num += one / 36;
                    if (one % 36)
                    {
                        ++num;
                    }
                    
                    printf("%d\n", num);
                }
                
                return 0;
            }


            這樣的寫法顯然不好吧。。。首先,余下1,2,3個3*3時候需要填幾個2*2的可以存儲在數組里面,這樣就可以不用寫重復代碼了,
            如果再從整體考慮余下多少個格子,就不用用貪心算法模擬裝箱子的過程了。。。
            代碼如下:
            #include <stdio.h>
            int main()
            {
                int one, two, three, four, five, six;
                int num = 0;
                int twoPlace[4] = {0, 5, 3, 1};
                int remTwo, remOne;
                
                while (scanf("%d%d%d%d%d%d", &one, &two, &three, &four, &five, &six) == 6)
                {
                    if (one == 0 && two == 0 && three == 0 && four == 0 && five == 0 && six == 0)
                    {
                        break;
                    }
                    
                    num = six + five + four + (three + 3) / 4;
                    remTwo = four * 5 + twoPlace[three % 4];
                    if (two > remTwo)
                    {
                        num += (two - remTwo + 8) / 9;
                    }
                    
                    remOne = 36 * num - 36 * six - 25 * five - 16 * four - 9 * three - 4 * two;
                    if (one > remOne)
                    {
                        num += (one - remOne + 35) / 36;
                    }
                    
                    printf("%d\n", num);
                }
                
                return 0;
            }

            posted @ 2011-11-08 20:15 yx 閱讀(1938) | 評論 (0)編輯 收藏

            POJ百練 - 2808:校門外的樹

              鏈接:http://poj.grids.cn/practice/2808

              方法1(空間換時間):
              #include <stdio.h>
              int main()
              {
                  int L, M;
                  int nTrees[10005] = {0};
                  int start, end;
                  int nCount = 0;
                  
                  scanf("%d%d", &L, &M);
                  while (M--)
                  {
                      scanf("%d%d", &start, &end);
                      for (int i = start; i <= end; ++i)
                      {
                          nTrees[i] = 1;
                      }
                  }
                  
                  for (int i = 0; i <= L; ++i)
                  {
                      if (nTrees[i] == 0)
                      {
                          nCount++;
                      }
                  }
                  
                  printf("%d\n", nCount);
                  return 0;
              }
              方法2(合并區間):
              思想是將所有區間存儲在數組里面,對所有區間以下限為標準排序,然后從頭至尾掃描區間數組,
              合并區間的方法是:當前區間初始化為第一個區間,然后判斷下一個區間的下限是否已經超過當前區間的上限,如果是這樣的話,就無法繼續合并了,那么就繼續已經合并區間的長度,重新開始一次新的合并,否則的話,將下一個區間合并到當前區間起來。。。
              #include <stdio.h>
              #include <stdlib.h>
              #define M_MAX 100 + 2
              struct Area{
                  int start;
                  int end;
              };
              int CompareArea(const void *elem1, const void *elem2)
              {
                  return ((Area*)elem1)->start - ((Area*)elem2)->start;
              }
              int main()
              {
                  Area area[M_MAX], temp;
                  int L = 0;
                  int M = 0;
                  int count = 0;
                  scanf("%d%d", &L, &M);
                  for (int i = 0; i < M; ++i)
                  {
                      scanf("%d%d", &area[i].start, &area[i].end);
                  }
                  qsort(area, M, sizeof(Area), CompareArea);
                  
                  temp = area[0];
                  for (int i = 1; i < M; ++i)
                  {
                      if (area[i].start <= temp.end)
                      {
                          if (area[i].end > temp.end)
                          {
                              temp.end = area[i].end;
                          }
                      }
                      else
                      {
                          count += temp.end - temp.start + 1;
                          temp = area[i];
                      }
                  }
                  count += temp.end - temp.start + 1;
                  
                  printf("%d\n", L + 1 - count);
                  
                  return 0;
              }
              整個算法的時間復雜度是 O(M * logM) + O(M)...

            posted @ 2011-11-07 13:27 yx 閱讀(652) | 評論 (0)編輯 收藏

            New Begin

               這個blog的申請時間估計已經有1個多星期了。。。那是在我最無聊的時刻吧。。。從前天起的前面6天外出旅行了,用的是生物能,用我們自己的雙腳踩車去了新寧崀山。從長沙到哪里也有300多公里。想起這6天的種種,收獲頗豐。我也不是來寫這篇游記的,所以這次旅行也不想說得過多了。
               我以后會很少在 qzone 和 人人 以及 百度空間 上更新任何文章了。不管是發牢騷還是記錄些學習感悟,都不會寫在那上面了。如果有熟人有心看到過我這個blog的話,就不必要去看其它地方的了,那里只有我以前的胡亂感受。
               一恍大學過了3年多了,大四了,保研也確定了3個多星期了。前2個星期,則完全是在宿舍宅了半個月。第三個星期,鼓起勇氣出去旅行。說實話,一直到那天早上我都猶豫要不要去的了。后面的3天,基本上每天都有12小時在路上奔走。第一天非常難受,剛過猴子石大橋就感覺受不了了,還好出城的時候走的慢,一直跟在李后面。。。出城后,到暮云,到湘潭,那個上午就感覺用夠了全部力量了。下午開走前,真的懷疑過接下來該怎么辦。。。在路上的那種難受感覺說也說不出來,其實我身體很虛的那種。在宿舍宅了3年多,生活沒有規律,飲食也不夠。第一天真的非常難受。走不動的時候,我老是想一些這幾年讓我痛不欲生的事情,我永遠也無法改變無法解決,但是又最后會把錯誤歸咎到自己身上的事情。真的痛不欲生。。。也許,這就是生命。生命就是一場旅行,雖然很痛,但是沿途還有風景,這種旅行本身就具備了最大的意義。
               真的是萬事開頭難,第二天就沒有那么強烈的感覺了。雖然,還是沒有力氣,還是很難受,但是還是稍微適應了點了。堅持才是勝利,這句話在這個時候很對。第三天,我完全感覺跟前面2天不同了,這一天我能夠騎到前面去了,雖然這一天的路最爛,最陡。。。不要以為成功就是那么容易,即使經過3天的艱苦車行。我們還是沒有到達目的地,我們只是到了新寧的一個鎮,離縣城還是有50多公里,這邊路這么爛,基本上在修的爛國道,而且還帶盤山的那種。第四天,只能做中吧去了,坐車時候受到了鄙視比騎車時更多,車放在里面而不是后備箱確實礙著太多人了,農村里面的車也擠成那樣了,我也一直不會說什么好話。。。第四天,我們終于出了縣城到了景區。到景區大門的時候,就開始虛脫了,不是因為長途跋涉,而是因為腸胃不好,發作了,拉了個肚子之后整個人就虛脫了。唉,確實不是這么容易啊。。。
               第四天我們看了一個景區,第五天看了二個更爽的景區,每天基本也是活動12小時以上。感謝住的地方那么干凈,老板娘做的菜也那么好吃。如果再去一定會住那里,也會向別人推薦那里。那個家庭賓館我們還拍了照。一路所有的照片都在qq空間里面了。。。
               

               說了不寫游記的,我還是寫了這么多的。。。這篇游記如果真的認真寫實在太長了,一路也沒有記日記。這5天多的感受,比我大學里面任何時間的感覺受激烈很多。我收獲了很多很多。本來就打算以此作為開始,重開我的人生的。這輩子做過太多不堪的事情了,是時候為了自己,不受任何世俗觀念影響做點事情了。。。
               

            posted @ 2011-11-07 09:38 yx 閱讀(375) | 評論 (2)編輯 收藏

            僅列出標題
            共10頁: First 2 3 4 5 6 7 8 9 10 
            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            導航

            統計

            公告

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            me

            好友

            同學

            網友

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            18岁日韩内射颜射午夜久久成人| 久久久久这里只有精品| 欧美黑人又粗又大久久久| 无码超乳爆乳中文字幕久久| 狠狠色噜噜狠狠狠狠狠色综合久久| 91精品国产91热久久久久福利 | 久久久久亚洲精品日久生情| 99久久国产精品免费一区二区| 精品久久久久久久无码| 久久久WWW成人免费毛片| 亚洲成色www久久网站夜月 | 欧洲成人午夜精品无码区久久| 久久免费美女视频| 久久SE精品一区二区| 亚洲一区中文字幕久久| 性做久久久久久久| 久久久久国色AV免费观看| 韩国免费A级毛片久久| 久久久久99这里有精品10| 91精品国产91久久久久久蜜臀| 久久精品无码一区二区WWW| 久久99热这里只有精品国产| 无码人妻久久一区二区三区| 久久久噜噜噜久久| 欧美精品一区二区精品久久 | 久久久久久国产精品免费无码 | 深夜久久AAAAA级毛片免费看| 欧美大香线蕉线伊人久久| 久久久久亚洲AV综合波多野结衣| 色8久久人人97超碰香蕉987| 久久人人爽人人精品视频| 久久免费高清视频| 青青草国产精品久久| 久久精品国产网红主播| 日日躁夜夜躁狠狠久久AV| 国内精品久久久久影院老司| 久久久久国产精品麻豆AR影院| 91精品免费久久久久久久久| 伊人久久大香线焦综合四虎| 91精品国产综合久久香蕉| 久久免费小视频|