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

            Uriel's Corner

            Research Associate @ Harvard University / Research Interests: Computer Vision, Biomedical Image Analysis, Machine Learning
            posts - 0, comments - 50, trackbacks - 0, articles - 594
                昨天開始做的ZJU 2011年保研復(fù)試題, 早就聽鯨魚隊(duì)長說過題目超水的, 就想著速度水過, 結(jié)果被Diff那題卡了快2天, 后來問了鯨魚隊(duì)長, 去年考試現(xiàn)場(chǎng)貌似真木有人做出來... (個(gè)人認(rèn)為這題題目說的真不清楚... PE到抓狂...這題下面再細(xì)說)

            1. Twin Prime Conjecture
                水題, 給你一個(gè)整數(shù)n (n < 1e5), 問<n的數(shù)中有多少對(duì)素?cái)?shù), 滿足它們的差為2
                先線性篩素?cái)?shù), 然后預(yù)處理出所有n (n < 1e5) 中, <n的滿足條件的素?cái)?shù)對(duì)數(shù), 然后對(duì)于每個(gè)Query, 直接輸出
            //浙大計(jì)算機(jī)研究生保研復(fù)試上機(jī)考試-2011年 Twin Prime Conjecture
            #include<stdio.h>
            #include
            <stdlib.h>
            #include
            <string.h>
            #define N 100010

            int lenPr, record[N], prime[N], sum[N], ans[N];

            void init() {
                memset(record, 
            0sizeof(record));    
                lenPr 
            = 0;
                record[
            0= 1;
                record[
            1= 1;
                
            for (int i = 2; i <= 100000++i) {
                    
            if (!record[i]){
                        
            ++lenPr;
                        prime[lenPr 
            - 1= i;
                    }

                    
            for(int j = 0; j <= lenPr - 1++j) {
                        
            if (i * prime[j] > 100000break;
                        record[i 
            * prime[j]] = 1;
                        
            if (!(i % prime[j])) break;
                    }

                }

            }


            int main() {
                
            int i, n, pre;
                init();
                
            int cnt = 0;
                pre 
            = 2;
                
            for(i = 0; i <= 100000++i) {
                    
            if(!record[i]) {
                        
            if(i - pre == 2) ans[i] = ++cnt;
                        
            else 
                            ans[i] 
            = cnt;
                        pre 
            = i;
                    }

                    
            else
                        ans[i] 
            = cnt;
                }

                
            while(scanf("%d"&n), n > 0{
                    printf(
            "%d\n", ans[n]);
                }

                
            return 0;
            }


            2. Is It Symmetric
                水題, 判斷一個(gè)數(shù)是否是回文數(shù), 該數(shù)可做任意多次循環(huán)左移/右移操作
                暴力之, 假設(shè)數(shù)的長度為len, 做len次, 每次循環(huán)左移一位, 然后判斷
            //浙大計(jì)算機(jī)研究生保研復(fù)試上機(jī)考試-2011年 Is It Symmetric
            #include<stdio.h>
            #include
            <stdlib.h>
            #include
            <string.h>

            int l, ll;
            char s[200], ss[200];

            int main() {
                
            int i, j;
                
            while(scanf("%s", s), s[0!= '#'{
                    l 
            = strlen(s);
                    ll 
            = l >> 1;
                    
            for(i = 0; i < l; ++i) {
                        memset(ss, 
            0x00sizeof(ss));
                        
            for(j = i; j < l; ++j) ss[j - i] = s[j];
                        
            for(j = 0; j < i; ++j) ss[j + l - i] = s[j];
                        
            for(j = 0; j < ll; ++j) {
                            
            if(ss[j] != ss[l - j - 1]) break;
                        }

                        
            if(j == ll) break;
                    }

                    
            if(i == l) puts("NO");
                    
            else
                        printf(
            "YES %d\n", (i + ll) % l);
                }

                
            return 0;
            }


            3. Magic Coupon
                貪心, coupons 和 product value的所有正數(shù)值從大到小排序, 大的和大的相乘, 小的和小的相乘; 所有負(fù)值從小到大排序, 也是小的和小的相乘(絕對(duì)值大的), 大的和大的相乘
                注意用__int64, 包括coupons和product value的值, 否則相乘時(shí)會(huì)越界(WA 3次才發(fā)現(xiàn), 弱啊... ...)
            //浙大計(jì)算機(jī)研究生保研復(fù)試上機(jī)考試-2011年  Magic Coupon
            #include<stdio.h>
            #include
            <stdlib.h>
            #include
            <string.h>
            #include
            <algorithm>
            using namespace std;
            #define N 1000010
            #define I __int64

            struct M{
                I val;
            }
            p[N], q[N];


            bool cmp1(M a, M b) {
                
            return a.val < b.val;
            }


            int nc, np;
            I ans;

            int main() {
                
            int i, j;
                
            while(scanf("%d"&nc), nc >= 0{
                    
            for(i = 0; i < nc; ++i) {
                        scanf(
            "%I64d"&p[i].val);
                    }

                    sort(p, p 
            + nc, cmp1);
                    scanf(
            "%d"&np);
                    
            for(i = 0; i < np; ++i) {
                        scanf(
            "%I64d"&q[i].val);
                    }

                    sort(q, q 
            + np, cmp1);
                    ans 
            = 0;
                    
            for(i = nc - 1, j = np - 1; i >= 0, j >= 0--i, --j) {
                        
            if(!(p[i].val > 0 && q[j].val > 0)) break;
                        ans 
            += p[i].val * q[j].val;
                    }

                    
            for(i = 0, j = 0; i < nc, j < np; ++i, ++j) {
                        
            if(!(p[i].val < 0 && q[j].val < 0)) break;
                        ans 
            += p[i].val * q[j].val;
                    }

                    printf(
            "%I64d\n", ans);
                }

                
            return 0;
            }


            4. Diff
                卡了快2天, 題目真的是沒有說清楚多行的時(shí)候應(yīng)該怎么輸出啊...!!
                一開始看了很久都沒有理解最后一個(gè)sample, 好不容易想出一種能說得通的理解方式, 敲了半天, 果斷WA (還有幾次TLE是WA得頭昏了, freopen忘記去掉了...), 昨天網(wǎng)上改來改去終于WA變成PE, 就PE到死也莫名了... ...
                實(shí)在無奈, 今天搜到一個(gè)解題報(bào)告, www.cnblogs.com/while2/archive/2011/03/14/1983524.html 對(duì)拍之后發(fā)現(xiàn)有幾個(gè)多行的case輸出不同, 但是對(duì)解題報(bào)告為什么那樣輸出理解不能... ... 猥瑣地用小號(hào)試了下解題報(bào)告的代碼, 完美地AC了, 于是把輸出的那里改成解題報(bào)告的那種思路了... ... 改完對(duì)拍了下, 還是有一些數(shù)據(jù)不同... 交了下, 竟然就AC了, 莫名啊... = =||

            PE的代碼, 依然莫名中...
            路過的大牛有空指教的話不甚感激
            //浙大計(jì)算機(jī)研究生保研復(fù)試上機(jī)考試-2011年 Diff
            #include<stdio.h>
            #include
            <stdlib.h>
            #include
            <string.h>
            #define N 5010

            int n, m, l1, l2, fi, fj, nt, dp[N][N], flg[N][N], f[N], g[N];
            char s[100], ss1[N], ss2[N], common[N];

            void LCS(char *a, char *b) {
                
            int i, j;
                
            bool ok = false;
                fi 
            = fj = 0;
                
            for(i = 0; i <= l1; ++i) dp[i][0= 0;
                
            for(i = 0; i <= l1; ++i) dp[0][i] = 0;
                
            for(i = 1; i <= l1; ++i) 
                    
            for(j = 1; j <= l2; ++j)
                        
            if(a[i - 1== b[j - 1]) {
                            dp[i][j] 
            = dp[i - 1][j - 1+ 1;
                            flg[i][j] 
            = 1;
                        }

                        
            else {
                            
            if(dp[i - 1][j] > dp[i][j - 1]) {
                                dp[i][j] 
            = dp[i - 1][j];
                                flg[i][j] 
            = 2;
                            }

                            
            else {
                                dp[i][j] 
            = dp[i][j - 1];
                                flg[i][j] 
            = 3;
                            }

                        }

                        
            return;
            }


            void traceback(int i, int j) {
                
            while(i > 0 && j > 0{
                    
            if(flg[i][j] == 1{
                        
            --i; --j;
                        common[nt
            ++= ss1[i];
                    }

                    
            else if(flg[i][j] == 2{
                        
            --i;
                    }

                    
            else if(flg[i][j] == 3{
                        
            --j;
                    }

                }

            }


            int main() {
                
            //freopen("d:\\in.txt", "r", stdin);
                
            //freopen("d:\\out.txt", "w", stdout);
                int i, j, pos, line;
                
            bool ff, nl;
                
            while(scanf("%d"&n), n >= 0{
                    scanf(
            "%d"&m);
                    getchar();
                    memset(f, 
            0sizeof(f));
                    memset(g, 
            0sizeof(g));
                    memset(ss1, 
            0x00sizeof(ss1));
                    memset(ss2, 
            0x00sizeof(ss2));
                    memset(common, 
            0x00sizeof(common));
                    
            for(i = 0; i < n; ++i) {
                        gets(s);
                        strcat(ss1, s);
                        f[strlen(ss1)] 
            = 1;
                    }

                    
            for(i = 0; i < m; ++i) {
                        gets(s);
                        strcat(ss2, s);
                        g[strlen(ss2)] 
            = 1;
                    }

                    l1 
            = strlen(ss1), l2 = strlen(ss2);
                    LCS(ss1, ss2);
                    
            if(dp[l1][l2] == 0) puts("Totally different");
                    
            else if(dp[l1][l2] == l1 && l1 == l2) puts("No difference found");
                    
            else {
                        nt 
            = 0;
                        traceback(l1, l2);
                        printf(
            "%d\n", dp[l1][l2]);
                        i 
            = 1, j = 1; pos = nt - 1; line = 2;
                        puts(
            "line #1");
                        nl 
            = false;
                        
            while(pos >= 0{
                            ff 
            = false;
                            
            while(ss1[i - 1!= common[pos]) {
                                putchar(ss1[i 
            - 1]);
                                ff 
            = true;
                                nl 
            = true;
                                
            if(f[i]) {
                                    printf(
            "-\nline #%d\n", line++);
                                    
            ++i;
                                    ff 
            = false;
                                    nl 
            = false;
                                    
            goto M;
                                }

                                
            ++i;
                            }

                            
            if(ff) {
                                putchar(
            '-');
                                nl 
            = true;
                                ff 
            = false;
                            }

                            
            if(f[i] && nl && i < l1) {
                                printf(
            "\nline #%d\n", line++);
                                nl 
            = false;
                            }

                            
            else if(f[i] && nl && i == l1) {
                                puts(
            "");
                                nl 
            = false;
                            }

                            
            ++i;
                            ff 
            = false;
                            
            while(ss2[j - 1!= common[pos]) {
                                ff 
            = true;
                                putchar(ss2[j 
            - 1]);
                                nl 
            = true;
                                
            if(g[j]) {
                                    putchar(
            '+');
                                    puts(
            "");
                                    nl 
            = false;
                                    ff 
            =false;
                                }

                                
            ++j;
                            }

                            
            if(ff) {
                                putchar(
            '+');
                                ff 
            = false;
                            }

                            
            else if(g[j] && nl) {
                                puts(
            "");
                                nl 
            = false;
                            }

                            
            ++j;
                            
            if(i > l1 || j > l2) break;
                            pos
            --;
            M:                    ;
                        }

                        ff 
            = false;
                        
            while(i <= l1) {
                            ff 
            = true;
                            putchar(ss1[i 
            - 1]);
                            nl 
            = true;
                            
            if(f[i]) {
                                putchar(
            '-');
                                nl 
            = true;
                                
            if(i < l1) {
                                    printf(
            "\nline #%d\n", line++);
                                    nl 
            = false;
                                }

                                ff 
            =false;
                            }

                            
            ++i;
                        }

                        
            if(ff) {
                            putchar(
            '-');
                            nl 
            = true;
                        }

                        ff 
            = false;
                        
            while(j <= l2) {
                            ff 
            = true;
                            putchar(ss2[j 
            - 1]);
                            nl 
            = true;
                            
            if(g[j]) {
                                putchar(
            '+');
                                nl 
            = true;
                                
            if(j < l2) {
                                    puts(
            "");
                                    nl 
            = false;
                                }

                                ff 
            = false;
                            }

                            
            ++j;
                        }

                        
            if(ff) putchar('+');
                        
            if(nl)puts("");
                    }

                }

                
            return 0;
            }


            AC的代碼
            //浙大計(jì)算機(jī)研究生保研復(fù)試上機(jī)考試-2011年 Diff
            #include<stdio.h>
            #include
            <stdlib.h>
            #include
            <string.h>
            #define N 5010

            int n, m, l1, l2, nt, na, line, dp[N][N], flg[N][N], f[2][N], ned[2], usd[2];
            char s[100], ss[2][N], common[N], ans[2 * N], mark[3= "-+";

            void LCS(char *a, char *b) {
                
            int i, j;
                
            bool ok = false;
                
            for(i = 0; i <= l1; ++i) dp[i][0= 0;
                
            for(i = 0; i <= l2; ++i) dp[0][i] = 0;
                
            for(i = 1; i <= l1; ++i) 
                    
            for(j = 1; j <= l2; ++j)
                        
            if(a[i - 1== b[j - 1]) {
                            dp[i][j] 
            = dp[i - 1][j - 1+ 1;
                            flg[i][j] 
            = 1;
                        }

                        
            else {
                            
            if(dp[i - 1][j] > dp[i][j - 1]) {
                                dp[i][j] 
            = dp[i - 1][j];
                                flg[i][j] 
            = 2;
                            }

                            
            else {
                                dp[i][j] 
            = dp[i][j - 1];
                                flg[i][j] 
            = 3;
                            }

                        }

                        
            return;
            }


            void traceback(int i, int j) {
                
            while(i > 0 && j > 0{
                    
            if(flg[i][j] == 1{
                        common[nt
            ++= ss[0][i - 1];
                        
            --i; --j;
                    }

                    
            else if(flg[i][j] == 2--i;
                    
            else
                        
            --j;
                }

            }


            void addmk(int i) {
                
            if(na != 0 && ans[na - 1!= '+' && ans[na - 1!= '-')
                    ans[na
            ++= mark[i];
            }


            void addline(int i) {
                
            if(na != 0 && ans[na - 1!= '\n'{
                    addmk(i);
                    printf(
            "%s\n", ans);
                    
            if(!i) printf("line #%d\n", line++);
                    na 
            = 0; memset(ans, 0x00sizeof(ans));
                }

            }


            void checked(int i, int idx) {
                
            if(ned[i] > usd[i] && idx == f[i][usd[i]]) {
                    usd[i]
            ++;
                    addline(i);
                }

            }


            void out(int i, int &idx, char ed) {
                
            if(ss[i][idx] == ed) {
                    
            ++idx;
                    
            checked(i, idx);
                    
            return;
                }

                
            while(ss[i][idx] != ed) {
                    ans[na
            ++= ss[i][idx];
                    
            ++idx;
                    
            checked(i, idx);
                }

                
            ++idx;
                addmk(i);
                
            checked(i, idx);
                
            return;
            }


            int main() {
                
            //freopen("d:\\in.txt", "r", stdin);
                
            //freopen("d:\\out.txt", "w", stdout);
                int i, j;
                
            while(scanf("%d"&n), n >= 0{
                    scanf(
            "%d"&m);
                    getchar();
                    memset(f, 
            0sizeof(f));
                    memset(ss, 
            0x00sizeof(ss));
                    memset(ans, 
            0x00sizeof(ans));
                    memset(common, 
            0x00sizeof(common));
                    ned[
            0= ned[1= 0;
                    
            for(i = 0; i < n; ++i) {
                        gets(s);
                        strcat(ss[
            0], s);
                        
            if(i < n - 1)f[0][ned[0]++= strlen(ss[0]);
                    }

                    
            for(i = 0; i < m; ++i) {
                        gets(s);
                        strcat(ss[
            1], s);
                        
            if(i < m - 1)f[1][ned[1]++= strlen(ss[1]);
                    }

                    
            if(!strcmp(ss[0], ss[1])) {
                        puts(
            "No difference found");
                        
            continue;
                    }

                    l1 
            = strlen(ss[0]); l2 = strlen(ss[1]);
                    LCS(ss[
            0], ss[1]);
                    
            if(!dp[l1][l2]) {
                        puts(
            "Totally different");
                        
            continue;
                    }

                    nt 
            = na = 0;
                    memset(ans, 
            0x00sizeof(ans));
                    printf(
            "%d\n", dp[l1][l2]);
                    traceback(l1, l2);
                    i 
            = 0, j = 0; line = 2;
                    usd[
            0= usd[1= 0;
                    printf (
            "line #1\n");
                    
            while(nt > 0{
                        
            char ch = common[nt - 1];
                        nt
            --;
                        
            out(0, i, ch);
                        
            out(1, j, ch);
                    }

                    
            out(0, i, 0);
                    
            out(1, j, 0);
                    printf(
            "%s\n", ans);
                }

                
            return 0;
            }

            我AC的代碼跟解題報(bào)告跑出來結(jié)果不同的數(shù)據(jù):
            1 1
            ababab
            babab
            1 1       //前兩組數(shù)據(jù)一樣, 但解題報(bào)告的代碼跑出來的第一次多一個(gè)回車...
            ababab
            babab
            2 2
            fdasf
            sdfdsg
            fhgfh
            dfhfdhfd
            4 4
            sdf
            tre
            ghjdf
            wtrwt
            erte
            wet
            ytrye
            eqtqe
            久久久精品久久久久特色影视| 久久久久久无码Av成人影院| 亚洲精品tv久久久久| 亚洲午夜精品久久久久久app| 国产精品成人久久久| 久久水蜜桃亚洲av无码精品麻豆| 久久国产精品久久精品国产| 国产精品激情综合久久| 欧洲国产伦久久久久久久| 18岁日韩内射颜射午夜久久成人 | 国产激情久久久久久熟女老人| 伊人久久大香线蕉综合影院首页| 久久国产精品成人片免费| 精品久久久久久无码中文野结衣| 久久成人小视频| 亚洲国产成人久久综合一 | 国内精品久久久久久久涩爱| 中文字幕亚洲综合久久菠萝蜜| 99久久人妻无码精品系列| 久久精品女人天堂AV麻| 久久香蕉超碰97国产精品| 久久亚洲国产成人精品无码区| 久久久久久久久久久久中文字幕| 久久99精品久久久久久不卡 | 蜜臀av性久久久久蜜臀aⅴ| 久久99久久成人免费播放| 久久人人爽人人爽人人片av高请| 久久久久无码专区亚洲av| 久久九九精品99国产精品| 香蕉久久AⅤ一区二区三区| 日本免费久久久久久久网站| 色妞色综合久久夜夜| 久久成人国产精品一区二区| 97久久超碰成人精品网站| 国产精品一区二区久久精品涩爱| 97久久国产亚洲精品超碰热| 人人狠狠综合久久88成人| 精品久久久久久久久久中文字幕 | 久久国产AVJUST麻豆| 久久精品国产99久久久古代| 狠狠久久综合|