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

            Climber.pI的OI之路

            Through the darkest dark,may we see the light.

            #

            初賽零散復習

            完善程序最好總結一下以前題目常常要你填出來的語句類型。這個每年都差不多的,想不出來是可以回憶一下有哪些可能填的語句,再放到程序里面看是否合適。

            龍芯 http://baike.baidu.com/view/3625.htm
            IBM Power系列http://www.enet.com.cn/article/2010/0228/A20100228615002.shtml
            AMD http://china.amd.com.cn/processors/ComputingSolutions/default.aspx
            Intel 酷睿i系列 http://baike.baidu.com/view/3282306.htm
            計算機輔助系統 http://baike.baidu.com/view/1298192.html
            ASCII碼 http://zhidao.baidu.com/question/94328098.html?fr=ala0
            圖靈 http://baike.baidu.com/view/2130.htm

            哈夫曼樹 http://baike.baidu.com/view/127820.htm
            多叉轉二叉 http://hi.baidu.com/%C6%AE%BB%A8%C4%EA%B4%FA/blog/item/5ec37212ce87fbddf7039e84.html

            posted @ 2010-10-13 21:53 Climber.pI 閱讀(203) | 評論 (0)編輯 收藏

            NOIp 2004 合并果子

            NOIp中很少見的數據結構的題目,可以用堆實現,也可以用兩條隊列. 用堆實現,調了很久 = =
            需要注意down函數的邊界問題.

             1#include<stdio.h>
             2#include<string.h>
             3#include<iostream>
             4using namespace std;
             5int n, h[10010];
             6struct heap{
             7    void swap(int*i, int*j){
             8        int k = *i; *= *j; *= k;
             9    }

            10    void up(int k){
            11        while (k > 1)
            12            if (h[k/2> h[k]) {
            13                swap(&h[k/2], &h[k]);
            14                k /= 2;
            15            }
            else break;
            16    }

            17    void down(int k){
            18        while (2*<= n){
            19            int l = 2*k, r = l<? l+1 : l;
            20            if (h[r] < h[l]) l++;
            21            if (h[k] > h[l]){
            22                swap(&h[k], &h[l]);
            23                k = l;
            24            }
            else break;
            25        }

            26    }

            27    void insert(int x){
            28        h[++n] = x;
            29        up(n);
            30    }

            31    void del(int k){
            32        swap(&h[k], &h[n--]);
            33        
            34        down(k);
            35    }

            36    int pop(){
            37        del(1);
            38        return h[n+1];
            39    }

            40}
            ;
            41heap hp; 
            42int main(){
            43    int i, sum = 0;
            44    scanf("%d"&n);
            45    for (i = 1; i <= n; i++)
            46    scanf("%d"&h[i]);
            47    for (i = n/2; i > 0; i--) hp.down(i);
            48    while (n > 1){
            49        int x = hp.pop(), y = hp.pop();
            50        sum += x+y;
            51        hp.insert(x+y);
            52    }

            53    printf("%d\n", sum);
            54}

            55

            posted @ 2010-10-12 21:43 Climber.pI 閱讀(430) | 評論 (0)編輯 收藏

            NOIp 2008 初賽

            78 = 12+15+5+32+14,上80還是很困難.

            1.二分查找
                   設內部結點的總數為n=2^h-1,則判定樹是深度為h=log(n+1)的滿二叉樹(深度h不計外部結點)。樹中第k層上的結點個數為2k-1,查找它們所需的比較次數是k。因此在等概率假設下,二分查找成功時的平均查找長度為:ASLbn ≈ log(n+1)-1
                   二分查找在查找失敗時所需比較的關鍵字個數不超過判定樹的深度,在最壞情況下查找成功的比較次數也不超過判定樹的深度。

            2.問題求解第二題
            21本書中選4本,任意兩本編號不相鄰.
            去掉3個間隔,C(18,4)=3060.

            排列組合題總是簡單的出乎意料. = =

            3.快速排序算法不熟



            今天突然發現很多O(nlogn)級別的算法都和樹有很深的關系,遍歷的過程通常都是生成某種樹,然后查找長度和比較次數通常和樹的深度相關.

            posted @ 2010-10-11 21:15 Climber.pI 閱讀(237) | 評論 (0)編輯 收藏

            排序算法總結

            1.直接插入排序 O(n^2) 穩定
            2.希爾排序 O(n^1.3) 不穩定
            3.直接選擇排序 O(n^2) 不穩定
            4.堆排序 O(nlogn) 不穩定
            5.冒泡排序 O(n^2) 穩定
            6.快速排序 O(nlogn) 不穩定 =>可以看做構造二叉排序樹
            7.歸并排序 O(nlogn) 穩定

            整理自《奧賽經典·信息學》 第5章,原理略.

            posted @ 2010-10-11 20:56 Climber.pI 閱讀(204) | 評論 (0)編輯 收藏

            [整理]表達式樹

            [原文]http://blog.csdn.net/guocai_yao/archive/2009/04/11/4065718.aspx

            1.樹的遍歷法
            通過中綴表達式,構造表達式樹,然后利用前序或者后序遍歷.

            2.括號轉移法
            這里我給出一個中綴表達式

            a+b*c-(d+e)

            第一步:按照運算符的優先級對所有的運算單位加括號

                       式子變成拉:((a+(b*c))-(d+e))
            第二步:轉換前綴與后綴表達式
                    前綴:把運算符號移動到對應的括號前面
                            則變成拉:-( +(a *(bc)) +(de))
                            把括號去掉:-+a*bc+de  前綴式子出現
                    后綴:把運算符號移動到對應的括號后面
                            則變成拉:((a(bc)* )- (de)+ )-
                            把括號去掉:abc*-de+-  后綴式子出現
            發現沒有,前綴式,后綴式是不需要用括號來進行優先級的確定的。

            posted @ 2010-10-11 20:50 Climber.pI 閱讀(333) | 評論 (0)編輯 收藏

            NOIp 2005 過河

            線性dp,但是范圍很變態. = =

            30%的方程很容易想到:
            [狀態] f[i]表示從0到i點最少踩到的石子數, stone[i]表示i點有無石子;
            [方程] f[i] = max{f[i-j] + stone[i]} (S<=j<=T)
            [初始化] f[0] = 0, 其他賦值為無限大.

            在實現的時候需要把方程變化為 f[i+j] = max{f[i] + stone[i+j]},不然在[1,S]會出現很詭異的結果.
             
            由于m遠遠小于l,整個序列上的石子非常稀疏.所以可以減少狀態.但是目前對此還是有些不解.
            某種思路是,將石子間距大[1,2,..,9,10]=2520的逐次減至小于2520.注意要在收尾增加0和l兩個"石子",這樣計算新的l較為方便.


             1#include<stdio.h>
             2#include<iostream>
             3using namespace std;
             4#define MAXN 1000000;
             5bool L[200000= {0};
             6int f[200000= {0}, stone[110= {0};
             7int min(int x, int y){return x < y ? x : y;}
             8void swap(int x, int y){
             9    int k = stone[x];
            10    stone[x] = stone[y];
            11    stone[y] = k;
            12}

            13int main(){
            14    int l, S, T, M, i, j;
            15    scanf("%d%d%d%d"&l, &S, &T, &M);
            16    for (i = 1; i <= M; i++) scanf("%d"&stone[i]);
            17    stone[0= 0;
            18    for (i = 1; i < M; i++)
            19        for (j = i+1; j <= M; j++)
            20            if (stone[i] > stone[j]) swap(i, j);
            21    stone[++M] = l;
            22    for (i = 1; i <= M; i++){
            23        while (stone[i] - stone[i-1> 2520) stone[i] -= 2520;
            24        if (i != M) L[stone[i]] = 1;
            25    }

            26    l = stone[M--];
            27    for (i = 0; i <= l; i++) f[i] = MAXN; f[0= 0;
            28    for (i = 0; i < l; i++)
            29        for (j = S; j <= T; j++){
            30            int k = i+j;
            31            if (i + j >= l) k = l;
            32            f[k] = min(f[k], f[i]+L[i]);
            33        }

            34    printf("%d\n", f[l]);
            35}

            posted @ 2010-10-08 21:54 Climber.pI 閱讀(842) | 評論 (2)編輯 收藏

            NOIp 2003 加分二叉樹

            形DP,需要記錄方案,并注意空樹的情況.
            [狀態]f[i][j]從結點i到j的最大加分值
            [方程]f[i][j] = max{f[i][k-1]*f[k+1][j]+a[k]} (i<=k<=j)

            實現方程的時候循環順序非常關鍵:結點數由小到大循環.否則會出現需要的值未計算的情況.
            記錄方案可以用一個數組d[i][j]記錄k,然后遞歸尋找方案并記錄.

             1 #include<stdio.h>
             2 #include<iostream>
             3 using namespace std;
             4 int f[35][35] = {0}, d[35][35] = {0}, ans[35] = {0}, t = 0;
             5 void print(int start, int end){
             6     if (start > end) return;
             7     if (start == end) {ans[++t] = start; return;}
             8     ans[++t] = d[start][end];
             9     print(start, d[start][end]-1);
            10     print(d[start][end]+1, end);
            11 }
            12 int main(){
            13     int n, a[35] = {0}, i, j, k, l;
            14     scanf("%d", &n);
            15     for (i = 1; i <= n; i++){
            16         scanf("%d", &a[i]);
            17         f[i][i-1] = 1;
            18         f[i][i] = a[i];
            19     }
            20     for (l = 2; l <= n; l++)
            21         for (i = 1; i <= n; i++)
            22             for (k = i; k <= i+l-1; k++){
            23                 j = i+l-1;
            24                 if (f[i][j] < f[i][k-1]*f[k+1][j] + a[k]){
            25                     f[i][j] = f[i][k-1]*f[k+1][j] + a[k];
            26                     d[i][j] = k;
            27                 }
            28             }
            29     printf("%d\n", f[1][n]);
            30     print(1, n);
            31     for (i = 1; i < t; i++) printf("%d ", ans[i]);
            32     printf("%d\n", ans[t]);
            33 }
            34 


            posted @ 2010-10-05 11:10 Climber.pI 閱讀(1039) | 評論 (4)編輯 收藏

            NOIp 2006 金明的預算方案

            題目中附件不超過2個,因而主附件存在4種不同的存取情況,可以轉化為分組背包問題.
            [狀態]f[k][v]表示添加前k組物品,剩余空間為v時的最大值
            [方程]f[k][v] = max{f[k-1][v], f[k-1][v-c[i]]+w[i]}

            注意循環順序.(參見《背包九講》)

            需要注意的問題(2次WA):
            1.仔細讀題,確定編號對應的物品.
            2.注意到方程中的參數非負(背包類問題需注意).

             1 #include<stdio.h>
             2 #include<string.h>
             3 #include<iostream>
             4 using namespace std;
             5 int c[65][4], w[65][4], f[32000], set[70] = {0};
             6 int max(int a, int b){return a > b ? a : b;}
             7 int main(){
             8     int n, m, v, p, q, i, j, t = 0;
             9     FILE *fout = fopen("budget.out", "w");
            10     memset(c, -1, sizeof(c));
            11     memset(w, -1, sizeof(w));
            12     memset(f, 0, sizeof(f));
            13     scanf("%d%d", &n, &m);
            14     for (i = 0; i < m; i++){
            15         scanf("%d%d%d", &v, &p, &q);
            16         j = 0;
            17         if (!q) {
            18             c[++t][0] = v;
            19             w[t][0] = v*p;
            20             set[i+1] = t;
            21         }
            22         else{
            23             q = set[q];
            24             if (w[q][1] == -1){
            25                 //printf("dgfdgds\n");
            26                 c[q][1] = c[q][0] + v;
            27                 w[q][1] = w[q][0] + v*p; 
            28             }
            29             else if (w[q][2] == -1){
            30                 c[q][2] = c[q][0] + v;
            31                 w[q][2] = w[q][0] + v*p; 
            32                 c[q][3] = c[q][1] + v;
            33                 w[q][3] = w[q][1] + v*p; 
            34             }
            35         }
            36     }
            37     for (i = 1; i <= t; i++)
            38         for (v = n; v >= 0; v--)
            39             for (j = 0; j < 4; j++)
            40                 if (c[i][j] != -1 && v-c[i][j] >= 0){
            41                     f[v] = max(f[v], f[v-c[i][j]]+w[i][j]);
            42                 }
            43     printf("%d\n", f[n]);
            44 }
            45 


            posted @ 2010-10-05 10:11 Climber.pI 閱讀(490) | 評論 (0)編輯 收藏

            NOIp 2009 初賽

            時間幾乎用滿了,多選題很偏,73.5,全市第五.

            [得分情況]

            選擇題
            問題解決
            閱讀程序寫結果
            完善程序
            總分
            得分
            12+7.5
            0
            8+8+8+8
            10+12
            73.5
            [結論]
            1.數學太弱了.

            2.回去背選擇題
            3.全市前十五無壓力,爭取前五.
            4.抓緊搞復賽
            5.刷作業 = =

            [真知灼見]
            關于閱讀程序的題目
            1.弄清變量在程序中的作用.
            2.利用變量表示變量,而不要直接計算數值.

            看了各種題解后發現錯的好猥 - -
            下周果斷刷五三排列組合、二項式定理

            posted @ 2010-10-04 19:34 Climber.pI 閱讀(180) | 評論 (0)編輯 收藏

            轉:在博客園日志中顯示數學公式(舊,ASCIIMathML.js版說明)

            http://m.shnenglu.com/Climber-pI/archive/2010/10/04/128557.html

            【貌似CPU占用率會突然很高】

            昨天寫短消息給博客園開發團隊,詢問如果能在博客園的日志里更好的編輯或是使用數學公式。之前也在網上查過,貌似對ASCIIMathML有不錯的評價,希望能在博客園的日志里也能用得上。

            今天下班回來就看到回復的消息,內容如下:

            ASCIIMathML.js的確不錯。 
                        由于這個腳本比較大,默認就不加載了。 
                       你可以在頁首html中加上這個腳本的引用: 
                       <script type="text/javascript" src="http://common.cnblogs.com/script/ASCIIMathML.js"></script>

            感動啊,這么快就給出了回復,體貼!謝謝啦!

            真是開心啊,為了這個“小”功能我已經愁了很久了,好了,能有很好的代碼高亮和數學公式顯示~我已經滿足了,呵呵。

            PS:

            試了試,訪問的速度是會慢下一點來,忍了~!嘿嘿。下面順便簡單介紹下ASCIIMathML.js和支持的瀏覽器。

            ASCIIMathML.js是一種將ASCII符號翻譯成直觀的MathML(HTML版本)的開源JavaScript腳本。

            您只要遵循簡單的語法,用普通的ASCII字母和符號,就可以在網頁上輸入并顯示出漂亮的數學公式。這些公式遵循W3C標準,目前在Netscape7.1/Mozilla/Firefox下可以直接觀看,如果您用的是Internet Explorer和以之為內核的其它瀏覽器(如Maxthon或者GreenBrowser等),只需要下載一個插件。(下載插件MathPlayer,下載字體文件)

            posted @ 2010-10-04 11:53 Climber.pI 閱讀(720) | 評論 (0)編輯 收藏

            僅列出標題
            共8頁: 1 2 3 4 5 6 7 8 
            亚洲色婷婷综合久久| 久久久久亚洲av综合波多野结衣| 欧洲精品久久久av无码电影 | 99久久人人爽亚洲精品美女| 精品国产一区二区三区久久| 久久人爽人人爽人人片AV| 99国产精品久久| 国产—久久香蕉国产线看观看| 久久中文字幕无码专区| 天天爽天天狠久久久综合麻豆| 高清免费久久午夜精品| 性做久久久久久久久| 狠狠色丁香久久婷婷综| 色综合久久久久综合99| 久久精品欧美日韩精品| 久久精品国产99久久香蕉| 中文字幕久久久久人妻| 青青久久精品国产免费看| 国产精品久久午夜夜伦鲁鲁| 亚洲精品久久久www| 91久久精品国产成人久久| 伊人久久综合精品无码AV专区| 久久久久97国产精华液好用吗| 久久精品国产亚洲77777| 久久久久青草线蕉综合超碰 | 2020最新久久久视精品爱| 综合人妻久久一区二区精品| 久久99精品国产麻豆蜜芽| 97久久综合精品久久久综合 | 国产精品久久久99| 99久久精品午夜一区二区| 新狼窝色AV性久久久久久| 一本色道久久88综合日韩精品 | 亚洲熟妇无码另类久久久| 久久久久波多野结衣高潮| 久久久精品国产Sm最大网站| 精品久久久久久99人妻| 精品久久久久久国产三级| 精品久久久无码中文字幕天天| 国产精久久一区二区三区| 久久国产成人午夜AV影院|