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

            糯米

            TI DaVinci, gstreamer, ffmpeg
            隨筆 - 167, 文章 - 0, 評論 - 47, 引用 - 0
            數據加載中……

            POJ 1476 Always On the Run 動態規劃

            這題做得人特別少,但實際上就是很普通的動態規劃。

            思路:
            由于飛到某個點的時候,后面的行程跟前面的行程沒有什么聯系,所以開一個二維數組 f[K][N],
            f[i][j] = { 從第 j 個點,第 i 個時刻開始飛行直到終點,所需要的最小花費 }

            然后就從后往前推就可以了。

            #include <stdio.h>
            #include 
            <string.h>

            #define MAX_N 16
            #define MAX_D 32
            #define INFINITE 100000

            struct node {
                
            int arr[MAX_D], cnt;
            }
            ;
            struct node map[MAX_N][MAX_N];
            int N, K;

            __inline 
            void input()
            {
                
            int i, j, k;
                
            struct node *t;

                
            for (i = 1; i <= N; i++{
                    
            for (j = 1; j <= N; j++{
                        
            if (i == j)
                            
            continue;
                        t 
            = &map[i][j];
                        scanf(
            "%d"&t->cnt);
                        
            for (k = 0; k < t->cnt; k++)
                            scanf(
            "%d"&t->arr[k]);
                    }

                }

            }


            __inline 
            int min(int a, int b)
            {
                
            return a < b ? a : b;
            }


            __inline 
            void solve(int sc)
            {
                
            int dp[2][MAX_N], *cur, *nxt, i, j, k, val;
                
            struct node *t;

                memset(dp, 
            0sizeof(dp));
                dp[
            0][N] = 1;
                
            for (i = K - 1; i >= 0; i--{
                    cur 
            = dp[(K - 1 - i) & 1];
                    nxt 
            = dp[(K - i) & 1];
                    
            for (j = 1; j <= N; j++{
                        nxt[j] 
            = 0;
                        
            for (k = 1; k <= N; k++{
                            
            if (j == k || !cur[k])
                                
            continue;
                            t 
            = &map[j][k];
                            val 
            = t->arr[i % t->cnt];
                            
            if (!val)
                                
            continue;
                            val 
            += cur[k];
                            
            if (!nxt[j] || val < nxt[j])
                                nxt[j] 
            = val;
                        }

                    }

                }

                printf(
            "Scenario #%d\n", sc);
                
            if (nxt[1])
                    printf(
            "The best flight costs %d.\n\n", nxt[1- 1);
                
            else
                    printf(
            "No flight possible.\n\n");
            }


            int main()
            {
                
            int i;

                freopen(
            "e:\\test\\in.txt""r", stdin);

                
            for (i = 1; scanf("%d%d"&N, &K), N; i++{
                    input();
                    solve(i);
                }

            }

            posted @ 2010-03-30 16:29 糯米 閱讀(313) | 評論 (0)編輯 收藏

            POJ 1475 Pushing Boxes 推箱子游戲 寬搜

                 摘要: 思路:這題就是平常玩的那種推箱子的游戲。不過簡化了一下,只是推一個箱子而已。用 bfs 來做,搜索樹里面的節點,也就是狀態,可以定義為:1. 箱子的坐標2. 上一次推完之后,人要走多少步才能到達箱子的上、下、左、右側。如果到達不了,值則為無窮大。這樣,狀態轉移的時候。就首先看是否能向某個方向推。如果能的話,就推一下。然后對人進行一次 bfs ,看下此時到達箱子的各個側要走多少步。就可以生成一個新的...  閱讀全文

            posted @ 2010-03-30 09:07 糯米 閱讀(775) | 評論 (0)編輯 收藏

            POJ 3168 Barn Expansion 快排

            思路:

            一開始想到用線段樹來做,但是發現坐標范圍異常的大,放一個都勉勉強強,更不用說幾個了!
            想了一下,發現有一個至關重要的條件“不存在覆蓋的情況”。
            那就沒必要用線段樹了,因為壓根就沒必要解決覆蓋問題。
            可以用一種取巧的方法解決這題。



            對于每個矩形,首先把它 y 方向的兩條邊抽取出來。
            對于所有矩形的 y 方向的邊,先按照 x 排序,然后按照頂端的 y 坐標排序。



            然后對于位于同一 x 坐標的邊,找出所有首尾相接或者有交集的邊。
            那么這些邊對應的矩形必定要排除。

            對于 x 方向的邊,作同樣的處理。

            排除完之后,剩下的矩形就是可以答案了。

            代碼 500 多ms。。
            #include <stdio.h>
            #include 
            <stdlib.h>

            #define MAX_N 25032

            struct node {
                
            int barn, start, end, idx;
            }
            ;
            struct node vert[MAX_N * 2], hori[MAX_N * 2];
            char cannot[MAX_N];
            int N, ans;

            __inline 
            void add_node(struct node *t, int barn, int start, int end, int idx)
            {
                t
            ->barn = barn;
                t
            ->start = start;
                t
            ->end = end;
                t
            ->idx = idx;
            }


            int cmp_node(const void *a, const void *b)
            {
                
            struct node *p, *q;
                p 
            = (struct node *)a;
                q 
            = (struct node *)b;
                
            if (p->idx != q->idx)
                    
            return p->idx - q->idx;
                
            return p->start - q->start;
            }


            __inline 
            void disable_barn(int barn)
            {
                
            if (!cannot[barn]) {
                    cannot[barn] 
            = 1;
                    ans
            --;
                }
             
            }


            __inline 
            void calc(struct node *arr, int len)
            {
                
            int i, idx, end, cnt, first;

                i 
            = 0;
                
            while (i < len) {
                    idx 
            = arr[i].idx;
                    end 
            = arr[i].end;
                    first 
            = i;
                    cnt 
            = 0;
                    i
            ++;
                    
            while (i < len && arr[i].idx == idx && arr[i].start <= end) {
                        
            if (arr[i].end > end)
                            end 
            = arr[i].end;
                        disable_barn(arr[i].barn);
                        cnt
            ++;
                        i
            ++;
                    }

                    
            if (cnt)
                        disable_barn(arr[first].barn);
                }

            }


            int main()
            {
                
            int i, top, left, bottom, right;

                freopen(
            "e:\\test\\in.txt""r", stdin);

                scanf(
            "%d"&N);
                ans 
            = N;
                
            for (i = 0; i < N; i++{
                    scanf(
            "%d%d%d%d"&left, &bottom, &right, &top);
                    add_node(
            &vert[i * 2], i, bottom, top, left);
                    add_node(
            &vert[i * 2 + 1], i, bottom, top, right);
                    add_node(
            &hori[i * 2], i, left, right, top);
                    add_node(
            &hori[i * 2 + 1], i, left, right, bottom);
                }

                qsort(vert, N 
            * 2sizeof(vert[0]), cmp_node);
                qsort(hori, N 
            * 2sizeof(hori[0]), cmp_node);
                calc(vert, N 
            * 2);
                calc(hori, N 
            * 2);
                printf(
            "%d\n", ans);

                
            return 0;
            }


            posted @ 2010-03-18 15:52 糯米 閱讀(642) | 評論 (0)編輯 收藏

            POJ 3167 Cow Patterns 牛題

                 摘要: 此題只有130人solved!也算小牛題了,剛開始看到的時候,打算不做了的,但后來想了一下,發現有一點點思路。經過好幾個小時的奮戰,居然做出來了!那感覺非常爽!思路:首先此題的變態之處是,要求比較的是排名,就不是單純的字符串匹配了。如果每次都重新求排名然后跟pattern比較,復雜度 O(NK),八成會超時。關鍵是:一,不能每次都重新求排名二,不能逐個逐個的和pattern做比較看來也只有動態規...  閱讀全文

            posted @ 2010-03-18 15:30 糯米 閱讀(1193) | 評論 (2)編輯 收藏

            POJ 3175 Finding Bovine Roots 簡單計算

            思路:
            看到這題,第一個想到的方法就是枚舉 sqrt(2), sqrt(3), sqrt(4) 。。,然后sprintf出來,再比較字符串。
            顯然,這種方法比較低級啦。
            仔細想了下,發現如果 x.123... 這個數字的平方是一個整數的話,那必然
             sqr(x.124) > ceil(sqr(x.123))  [sqr = 求平方, ceil = 向上取整]
            所以,就可以從小到大枚舉它的整數部分 x ,遇到第一個滿足結果的 x,就是答案了。


            代碼 0ms AC
            #include <stdio.h>
            #include 
            <math.h>

            double A, P, B;
            int L;

            __inline 
            double sqr(double i)
            {
                
            return i * i;
            }


            double pow_1[] = {
                
            1, 1e-1, 1e-2, 1e-3, 1e-4, 1e-5, 1e-6, 1e-7, 1e-8, 1e-9, 1e-10
            }
            ;

            int main()
            {
                
            double i, j;
                
            int d;

                freopen(
            "e:\\test\\in.txt""r", stdin);

                scanf(
            "%d%d"&L, &d);
                P 
            = pow_1[L];
                B 
            = P * d;
                
            for (A = 1; ; A++{
                    i 
            = (__int64)sqr(A + B) + 1;
                    j 
            = sqr(A + B + P);
                    
            if (j > i)
                        
            break;
                }

                printf(
            "%I64d\n", (__int64)i);

                
            return 0;
            }

            posted @ 2010-03-18 08:46 糯米 閱讀(448) | 評論 (0)編輯 收藏

            POJ 3174 Alignment of the Planets 無語題

                 摘要: 這個題目立意很好,但是就是數據比較無語了。O(N^3)的算法都能跑得比 O(N^2LgN)的快。代碼寫很長,這份應該算比較爛了,連自己都不知道代碼的時間復雜度是多少!最終170ms AC,速度不快,比幾百行的O(N^3)代碼要慢很多。。。注意:用分數保存斜率,可以不觸及精度問題,而且還比較方便。提交了很多次都WA,不知道問題所在,于是還寫了一個腳本來測數據,然后發現了問題所在。附帶腳本和測試數據...  閱讀全文

            posted @ 2010-03-15 14:23 糯米 閱讀(561) | 評論 (0)編輯 收藏

            我們的純真與失落

            有人說,宮崎駿只拍過一部片子,叫做《我們的純真與失落》。

            posted @ 2010-03-14 21:40 糯米 閱讀(277) | 評論 (0)編輯 收藏

            POJ 1990 MooFest 樹狀數組

            思路:
            開四個樹狀數組。。
            arr_x,arr_y,arr_xy,arr_cnt
            分別統計y軸下:x的和、y的和、x*y的和、點的個數。
            把點按照x排序,x越大的點出現得越晚。
            從前往后推,每出現一個新的點的時候:
            Step1,將該點加入到四個數組中。
            Step2,對于高于它的點,面積增量為 x*sum(y) - sum(x*y)。
            Step3,對于低于它的點,面積增量為 sum(y) * (cnt * x - sum(x))
            最終得出結果。復雜度O(NlgN)。代碼 63ms。

            注意:
            需要用int64保存數組元素

            #include <stdio.h>

            #define MAX_X 20032
            #define MAX_Y 20032

            int cow[MAX_X], left, top, N;
            __int64 arr_x[MAX_Y], arr_y[MAX_Y], arr_xy[MAX_Y], arr_cnt[MAX_Y];

            __inline 
            int lowbit(int i)
            {
                
            return i & (i ^ (i - 1));
            }


            __inline __int64 sum(__int64 
            *arr, int i)
            {
                __int64 s;
                
                
            for (s = 0; i; i -= lowbit(i))
                    s 
            += arr[i];
                
            return s;
            }


            __inline 
            void insert(__int64 *arr, int i, __int64 val)
            {
                
            for (; i <= top; i += lowbit(i))
                    arr[i] 
            += val;
            }


            int main()
            {
                
            int i, x, y;
                __int64 s, sx, sy, sxy, c;

                freopen(
            "e:\\test\\in.txt""r", stdin);

                scanf(
            "%d"&N);
                left 
            = MAX_X;
                
            for (i = 0; i < N; i++{
                    scanf(
            "%d%d"&y, &x);
                    
            if (x < left)
                        left 
            = x;
                    
            if (y > top)
                        top 
            = y;
                    cow[x] 
            = y;
                }


                s 
            = 0;
                x 
            = left - 1;
                
            for (i = 0; i < N; i++{
                    
            for (x++!cow[x]; x++);
                    y 
            = cow[x];
                    insert(arr_x, y, x);
                    insert(arr_y, y, y);
                    insert(arr_xy, y, x 
            * y);
                    insert(arr_cnt, y, 
            1);
                    c 
            = sum(arr_cnt, y - 1);
                    sx 
            = sum(arr_x, y - 1);
                    s 
            += c*x*- sx*y;
                    sy 
            = sum(arr_y, top) - sum(arr_y, y - 1);
                    sxy 
            = sum(arr_xy, top) - sum(arr_xy, y - 1);
                    s 
            += x*sy - sxy;
                }


                printf(
            "%I64d\n", s);

                
            return 0;
            }

            posted @ 2010-03-14 17:39 糯米 閱讀(389) | 評論 (0)編輯 收藏

            POJ 1989 The Cow Lineup 動態規劃

            思路:
            如果之前出現過長度為 len 的子序列。假設該子序列出現在 [a, b] 之間。
            那如果存在 1, 2, ... K 任意一個數字出現在 [a, b] 之間,則必然存在一個長度為 len + 1 的非子序列。

            代碼:
            從后往前推。用的是鏈表。94ms AC。
            速度一般,還是不知道那些 0ms 是怎么搞出來的。
            有人說可以從前往后推,可能會快一點吧。

            #include <stdio.h>

            #define MAX_N 100032
            #define MAX_K 10032

            struct node {
                
            int idx;
                
            struct node *next;
            }
            ;
            struct node nodes[MAX_N], *pos[MAX_K];
            int N, K, left;

            int main()
            {
                
            int i, j, len;

                freopen(
            "e:\\test\\in.txt""r", stdin);
                
                scanf(
            "%d%d"&N, &K);
                
            for (i = 0; i < N; i++{
                    scanf(
            "%d"&j);
                    nodes[i].idx 
            = i;
                    nodes[i].next 
            = pos[j];
                    pos[j] 
            = &nodes[i];
                }


                left 
            = N + 1;
                
            for (len = 1; len <= N; len++{
                    j 
            = left;
                    
            for (i = 1; i <= K; i++{
                        
            while (pos[i] && pos[i]->idx >= left)
                            pos[i] 
            = pos[i]->next;
                        
            if (!pos[i])
                            
            break;
                        
            if (pos[i]->idx < j)
                            j 
            = pos[i]->idx;
                    }

                    
            if (i <= K)
                        
            break;
                    left 
            = j;
                }

                printf(
            "%d\n", len);

                
            return 0;
            }

            posted @ 2010-03-14 15:46 糯米 閱讀(460) | 評論 (0)編輯 收藏

            POJ 2132 Cow Math 二分

            思路:
            首先每條路徑的值都可以分解一下質因數,就可以表示為多個質數的冪相乘的形式,
             比如 2^6 * 3^8 * 17^22 * 23^1。

            三個數字a, b, c求最大公約數,分解完質因數后:
            如果a擁有2^8,b擁有2^10,c擁有2^4。那最大公約數必然擁有2^4,取最小的一個。
            對于每個質數 2, 3, 5, 7。。都是這個道理。

            如果是求最小公倍數,在剛剛的例子里,就是取最大的一個了。

            在點之間行走的過程,可以這樣來看。在點1的時候GCF的值是所有質數的最大次冪的乘積。
            GCF的值必定是越走越小。
            每經過一條路徑,CGF各個質因數的冪都必須小于等于路徑的對應的值。
            就好比路徑就只能容納這么大的流量。然后到達點2的時候,看看哪條路徑的流量最大。
            看起來像最大流問題,但不是最大流問題。

            我們沒辦法遍歷一次圖,就求出哪條路徑的流量最大。
            但由于路徑的權值最大才2000,質因數的冪最大也只有11(2^11 = 2048),大不了每個冪都試一次。
            用二分法就可以了。

            對于每一個質數,求到達點2 的時候的最大的冪。
            最后再乘起來,就是答案了。
            可見這種方法還是很巧妙的,效率也很高,0ms AC。

            注意:
            不需要高精度。但需要用__int64來保存答案。

            #include <stdio.h>

            #define MAX_W 2048
            #define MAX_N 32 

            int N, visit[MAX_N], map[MAX_N][MAX_N], tm;
            int prime[MAX_W], prime_cnt, max_cnt[MAX_W];

            int dfs(int idx, int val, int cnt)
            {
                
            int i, j, k;

                
            if (idx == 2)
                    
            return 1;

                visit[idx] 
            = tm;
                
            for (i = 1; i <= N; i++{
                    
            if (visit[i] == tm)
                        
            continue;
                    j 
            = map[idx][i];
                    
            for (k = 0; j && !(j % val); k++)
                        j 
            /= val;
                    
            if (k < cnt)
                        
            continue;
                    
            if (dfs(i, val, cnt))
                        
            return 1;
                }


                
            return 0;
            }


            __inline 
            int calc(int val, int r)
            {
                
            int l, m;

                l 
            = 0;
                
            while (l <= r) {
                    m 
            = (l + r) / 2;
                    tm
            ++;
                    
            if (dfs(1, val, m))
                        l 
            = m + 1;
                    
            else
                        r 
            = m - 1;
                }


                
            return r;
            }


            int main()
            {
                
            int i, j, val, p, cnt;
                __int64 r;

                freopen(
            "e:\\test\\in.txt""r", stdin);

                prime[prime_cnt
            ++= 2;
                
            for (i = 3; i < MAX_W; i++{
                    
            for (j = 0; j < prime_cnt && (i % prime[j]); j++);
                    
            if (j == prime_cnt)
                        prime[prime_cnt
            ++= i;
                }

                
                scanf(
            "%d"&N);
                
            for (i = 1; i <= N; i++)
                    
            for (j = 1; j <= N; j++)
                        scanf(
            "%d"&map[i][j]);
                
                
            for (i = 2; i <= N; i++{
                    val 
            = map[1][i];
                    
            for (j = 0; j < prime_cnt && val >= 1; j++{
                        p 
            = prime[j];
                        
            for (cnt = 0!(val % p); cnt++)
                            val 
            /= p;
                        
            if (cnt > max_cnt[j])
                            max_cnt[j] 
            = cnt;
                    }

                }

                
                
            for (i = 0; i < prime_cnt; i++{
                    
            if (!max_cnt[i])
                        
            continue;
                    max_cnt[i] 
            = calc(prime[i], max_cnt[i]);
                }


                r 
            = 1;
                
            for (i = 0; i < prime_cnt; i++{
                    
            if (!max_cnt[i])
                        
            continue;
                    
            for (cnt = 0; cnt < max_cnt[i]; cnt++)
                        r 
            *= prime[i];
                }

                printf(
            "%I64d\n", r);

                
            return 0;
            }

            posted @ 2010-03-14 14:37 糯米 閱讀(624) | 評論 (1)編輯 收藏

            僅列出標題
            共17頁: First 8 9 10 11 12 13 14 15 16 Last 
            久久精品国产亚洲AV蜜臀色欲 | 一本大道久久香蕉成人网| 久久久久久A亚洲欧洲AV冫| 久久国产AVJUST麻豆| 7777久久亚洲中文字幕| 亚洲欧美一级久久精品| 精品少妇人妻av无码久久| 热久久国产欧美一区二区精品| 久久国产精品成人影院| 久久无码人妻精品一区二区三区| 色综合久久久久久久久五月| 狠狠精品干练久久久无码中文字幕| 久久精品青青草原伊人| 久久精品国产亚洲av瑜伽| 五月丁香综合激情六月久久| 国内精品久久久久久久亚洲| 日韩久久久久久中文人妻| 性高朝久久久久久久久久| 99久久婷婷国产综合精品草原| 五月丁香综合激情六月久久| 一本色道久久88综合日韩精品 | 久久精品国产亚洲AV无码麻豆 | 久久天天躁狠狠躁夜夜不卡| 狠狠色伊人久久精品综合网| 国产精品一区二区久久| 色欲综合久久躁天天躁蜜桃| 久久精品免费全国观看国产| 久久中文精品无码中文字幕| 99久久国产主播综合精品 | 无码国内精品久久综合88| 国产午夜精品久久久久九九| 国产精品久久久久影院色| 日韩av无码久久精品免费| 青草国产精品久久久久久| 亚洲精品乱码久久久久久中文字幕| 欧美一级久久久久久久大片| 久久久无码精品午夜| 久久久久亚洲AV成人网人人网站 | 日本人妻丰满熟妇久久久久久| 亚洲精品高清国产一线久久| 国产色综合久久无码有码|