• <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
            數(shù)據(jù)加載中……

            POJ 1476 Always On the Run 動(dòng)態(tài)規(guī)劃

            這題做得人特別少,但實(shí)際上就是很普通的動(dòng)態(tài)規(guī)劃。

            思路:
            由于飛到某個(gè)點(diǎn)的時(shí)候,后面的行程跟前面的行程沒有什么聯(lián)系,所以開一個(gè)二維數(shù)組 f[K][N],
            f[i][j] = { 從第 j 個(gè)點(diǎn),第 i 個(gè)時(shí)刻開始飛行直到終點(diǎn),所需要的最小花費(fè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 糯米 閱讀(315) | 評論 (0)編輯 收藏

            POJ 1475 Pushing Boxes 推箱子游戲 寬搜

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

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

            POJ 3168 Barn Expansion 快排

            思路:

            一開始想到用線段樹來做,但是發(fā)現(xiàn)坐標(biāo)范圍異常的大,放一個(gè)都勉勉強(qiáng)強(qiáng),更不用說幾個(gè)了!
            想了一下,發(fā)現(xiàn)有一個(gè)至關(guān)重要的條件“不存在覆蓋的情況”。
            那就沒必要用線段樹了,因?yàn)閴焊蜎]必要解決覆蓋問題。
            可以用一種取巧的方法解決這題。



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



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

            對于 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 糯米 閱讀(646) | 評論 (0)編輯 收藏

            POJ 3167 Cow Patterns 牛題

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

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

            POJ 3175 Finding Bovine Roots 簡單計(jì)算

            思路:
            看到這題,第一個(gè)想到的方法就是枚舉 sqrt(2), sqrt(3), sqrt(4) 。。,然后sprintf出來,再比較字符串。
            顯然,這種方法比較低級啦。
            仔細(xì)想了下,發(fā)現(xiàn)如果 x.123... 這個(gè)數(shù)字的平方是一個(gè)整數(shù)的話,那必然
             sqr(x.124) > ceil(sqr(x.123))  [sqr = 求平方, ceil = 向上取整]
            所以,就可以從小到大枚舉它的整數(shù)部分 x ,遇到第一個(gè)滿足結(jié)果的 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 糯米 閱讀(450) | 評論 (0)編輯 收藏

            POJ 3174 Alignment of the Planets 無語題

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

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

            我們的純真與失落

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

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

            POJ 1990 MooFest 樹狀數(shù)組

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

            注意:
            需要用int64保存數(shù)組元素

            #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 糯米 閱讀(391) | 評論 (0)編輯 收藏

            POJ 1989 The Cow Lineup 動(dòng)態(tài)規(guī)劃

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

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

            #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 糯米 閱讀(462) | 評論 (0)編輯 收藏

            POJ 2132 Cow Math 二分

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

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

            如果是求最小公倍數(shù),在剛剛的例子里,就是取最大的一個(gè)了。

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

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

            對于每一個(gè)質(zhì)數(shù),求到達(dá)點(diǎn)2 的時(shí)候的最大的冪。
            最后再乘起來,就是答案了。
            可見這種方法還是很巧妙的,效率也很高,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 糯米 閱讀(626) | 評論 (1)編輯 收藏

            僅列出標(biāo)題
            共17頁: First 8 9 10 11 12 13 14 15 16 Last 
            久久人人爽人人爽人人爽 | 亚洲欧美国产日韩综合久久| 国产精品久久久99| 欧美日韩精品久久久久| 国产亚洲欧美精品久久久| 99精品伊人久久久大香线蕉| 久久影院亚洲一区| 亚洲国产另类久久久精品 | 久久精品夜夜夜夜夜久久| 精品综合久久久久久97超人| 欧美日韩精品久久久免费观看| 亚洲国产精品无码久久久蜜芽 | 精品免费久久久久久久| 久久精品国产一区二区 | 久久这里只有精品18| 久久久WWW成人免费毛片| 久久超乳爆乳中文字幕| 人妻精品久久久久中文字幕| 狠狠色丁香久久综合婷婷| 99久久综合国产精品免费| 亚洲国产精久久久久久久| 日本强好片久久久久久AAA| 麻豆久久| 久久久精品视频免费观看| 精品久久777| 久久精品国产第一区二区三区| 久久无码一区二区三区少妇| 国产日韩久久免费影院 | 少妇被又大又粗又爽毛片久久黑人| 久久国产色AV免费看| 亚洲日韩中文无码久久| 香蕉久久夜色精品国产尤物| 久久国产精品国语对白| www亚洲欲色成人久久精品| 久久久久中文字幕| 99久久精品费精品国产| 亚洲天堂久久精品| 国产午夜精品久久久久九九电影| 国内精品久久久久影院免费| 久久精品国产69国产精品亚洲| 久久婷婷五月综合色奶水99啪|