• <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>
            voip
            風(fēng)的方向
            厚德致遠(yuǎn),博學(xué)敦行!
            posts - 52,comments - 21,trackbacks - 0
                     最大m子段和問題:給定由n個(gè)整數(shù)(可能為負(fù))組成的序列a1、a2、a3...,an,以及一個(gè)正整數(shù)m,要求確定序列的m個(gè)不想交子段,使這m個(gè)子段的總和最大!
                     設(shè)b(i,j)表示數(shù)組a的前j項(xiàng)中i個(gè)子段和的最大值,并且第i個(gè)子段包含a[j](1<=i<=m,i<=j<=n),則所求的最優(yōu)值為maxb(m,j)(m<=j<=n)。在這種定義下b(i,j)的遞推公式:b(i,j)=max{b(i,j-1)+a[j],maxb(i-1,t)+a[j](i-1<=t<j)}(1<=i<=m,i<=j<=n);b(i,j-1)+a[j]表示第i個(gè)包含a[j-1]和a[j],maxb(i-1,t)+a[j]表示第i個(gè)子段僅包含a[j]。
                     這中定義很強(qiáng)悍,尤其是黃色標(biāo)記部分,直接把b(i,j)把a(bǔ)[j]限制在第i段內(nèi),然后再分a[j-1]和a[j]都在子段內(nèi)和只有a[j],特殊的當(dāng)m=1時(shí),b(1,j)=max(b(1,j-1)+a[j],a[j]),1<=j<=n;如果翻譯成文字的話,就是說在數(shù)組j位置的最大和子段(包含a[j])等于數(shù)組在j-1位置的最大和子段(包含a(j-1))加上a[j]和最大和子段只有a[j]的情況的最優(yōu)值,當(dāng)然所求解可以表示為maxb(1,j)(1<=j<=n);其實(shí)如果光從b(1,j)=max(b(1,j-1)+a[j],a[j])這個(gè)等式本生出發(fā)我們很容易的觀察出b(1,j-1)的正負(fù)直接決定著b(1,j)的取值,然后我們可以產(chǎn)生這中想法,如果b(1,j-1)為正,我就繼續(xù)加,如果為負(fù)我就重新開始加!!!這樣的話,寫成程序就更簡單,其實(shí)就是前面我寫的最大子段和的動(dòng)態(tài)規(guī)劃方法的解釋。。。(今天終于明白了!!!)

            代碼如下:

            #include<stdio.h>

            int MaxSum1(int m,int n,int *a)//m為切割段數(shù),n為數(shù)組大小
            {
                
            int i,j,k,sum;
                
            if(n<m||m<1)
                    
            return 0;
                
            int **=new int *[m+1];

                
            for(i=0;i<=m;i++)
                    b[i]
            =new int[n+1];
                
            for(i=0;i<=m;i++)
                    b[i][
            0]=0;
                
            for(j=1;j<=n;j++)
                    b[
            0][j]=0;

                
            for(i=1;i<=m;i++)
                    
            for(j=i;j<=n-m+i;j++)
                    
            {
                        
            if(j>i)
                        
            {
                            b[i][j]
            =b[i][j-1]+a[j];
                            
            for(k=i-1;k<j;k++)
                            
            {
                                
            if(b[i][j]<b[i-1][k]+a[j])
                                    b[i][j]
            =b[i-1][k]+a[j];
                            }

                        }

                        
            else
                        
            {
                            b[i][j]
            =b[i-1][j-1]+a[j];
                        }

                    }

                sum
            =0;
                
            for(j=m;j<=n;j++)
                    
            if(sum<b[m][j])
                        sum
            =b[m][j];
                delete b;
                
            return sum;
            }


            //教科書上又進(jìn)行了代碼優(yōu)化,如下
            int MaxSum(int m,int n,int *a)
            {
                
            int i,max,j,sum;
                
            if(n<m||m<1)
                    
            return 0;

                
            int *b=new int[n+1];
                
            int *c=new int[n+1];
                b[
            0]=0;
                c[
            0]=0;
                
            for(i=1;i<=m;i++)
                
            {
                    b[i]
            =b[i-1]+a[i];
                    c[i
            -1]=b[i];
                    max
            =b[i];
                    
            for(j=i+1;j<=i+n-m;j++)
                    
            {
                        b[j]
            =b[j-1]>c[j-1]?b[j-1]+a[j]:c[j-1]+a[j];
                        c[j
            -1]=max;
                        
            if(max<b[j])
                            max
            =b[j];
                    }

                    c[i
            +n-m]=max;
                }


                sum
            =0;
                
            for(j=m;j<=n;j++)
                    
            if(sum<b[j]) 
                        sum
            =b[j];
                
            return sum;
            }



            int main()
            {
                
            int n,m;
                
            int a[100],i;
                
            while(scanf("%d %d",&m,&n)!=EOF)
                
            {
                    
            for(i=1;i<=n;i++)
                        scanf(
            "%d",&a[i]);
                    printf(
            "%d\n",MaxSum(m,n,a));
                }

                
            return 0;
            }

                  對(duì)于這段代碼我按著思想看了一遍,沒有仔細(xì)推敲過,不知道會(huì)不會(huì)是個(gè)禍患,但是測試通過了!!!
            posted @ 2010-09-11 09:48 jince 閱讀(695) | 評(píng)論 (0)編輯 收藏
                           最大和和矩陣是最大和子段的推廣,是最大和子段推廣到二維的形式,當(dāng)然我們可把二維形再轉(zhuǎn)化成一維的形式,這就是求最大和矩陣方法了!二維轉(zhuǎn)化為一維時(shí)我們直接用窮舉法!

            代碼如下:

            #include<stdio.h>
            int  MaxSum(int n,int *a)
            {
                
            int sum=0,b=0;
                
            for(int i=1;i<=n;i++)
                
            {
                    
            if(b>0)
                        b
            +=a[i];
                    
            else
                        b
            =a[i];
                    
            if(b>sum) sum=b;
                }

                
            return sum;
            }

            int MaxSum2(int m,int n,int a[][100])
            {
                
            int sum=0;
                
            int *b=new int [n+1];
                
            for(int i=1;i<=m;i++)
                
            {
                    
            for(int k=1;k<=n;k++)
                        b[k]
            =0;

                    
            for(int j=i;j<=m;j++)
                    
            {
                        
            for(int k=1;k<=n;k++)
                        
            {
                            b[k]
            +=a[j][k];
                            
            int max=MaxSum(n,b);
                            
            if(max>sum)
                                sum
            =max;
                        }

                    }

                }

                delete b;
                
            return sum;
            }

            int main()
            {
                
            int a[100][100],i,j,n,sum,m;
                
            while(scanf("%d %d",&m,&n)!=EOF)
                
            {
                    
            for(i=1;i<=m;i++)
                        
            for(j=1;j<=n;j++)
                        
            {
                            scanf(
            "%d",&a[i][j]);
                        }

                    sum
            =MaxSum2(m,n,a);
                    printf(
            "%d\n",sum);
                }

                
            return 0;
            }

            運(yùn)行結(jié)果如下:

                  
            posted @ 2010-09-10 13:09 jince 閱讀(525) | 評(píng)論 (0)編輯 收藏
                                
                   昨天杭州的天氣真的只能用詭異來形容,上班時(shí),萬里無云!下班時(shí),半邊日出半邊雨!我住在杭城西面,下班是由東往西走的,前面 一個(gè)大太陽,后面狂風(fēng)暴雨,坐在公交車上,時(shí)而在雨幕里,時(shí)而在夕陽下。。更詭異的是我下來車后就開始打雷了,嚇的我一路狂奔回家,被雨追著跑的感覺真差!狂奔后,才發(fā)現(xiàn)自己原來這么虛弱,才跑了1000米左右,就感覺渾身乏力了,在學(xué)校體能測試的時(shí)候我可是跑第一的,缺少運(yùn)動(dòng)呀,看樣子人確實(shí)是要常常運(yùn)動(dòng)運(yùn)動(dòng),好東西也要常常拾得拾得!

                回家后我想起以前我同學(xué)問過我的一個(gè)問題,為什么是雷聲轟隆隆的?我當(dāng)時(shí)回答是云層碰撞不規(guī)整,強(qiáng)度有差異,其實(shí)這只是我的猜想。然后我同學(xué)又問了,為什么雷聲是轟隆隆傳向遠(yuǎn)方,然后消失了!我不知道了,沒做出回答!!當(dāng)時(shí)被同學(xué)小小的鄙視了一下,這個(gè)問題其實(shí)很多中學(xué)生都能回答出來!!!今天我又去網(wǎng)上查了一下,雷是怎么產(chǎn)生的,為什么雷聲是轟隆隆的?結(jié)果發(fā)現(xiàn)了以下文章:





            在完成一次閃電的時(shí)間內(nèi),窄狹的閃電通道上要釋放巨大的電能,因而形成強(qiáng)烈的爆炸,產(chǎn)生沖擊波,然后形成聲波向四周傳開,這就是雷聲或說
            "打雷"。 
            聽起來,雷聲可以分為兩種。一種是清脆響亮,象爆炸聲一樣的雷聲,一般叫做
            "炸雷";另一種是沉悶的轟隆聲,有人叫它做"悶雷"。還有一種低沉而經(jīng)久不歇的隆隆聲,有點(diǎn)兒象推磨時(shí)發(fā)出的聲響。人們常把它叫做"拉磨雷",實(shí)際上是悶雷的一種形式。 


              閃電通路中的空氣突然劇烈增熱,使它的溫度高達(dá)15000
            -20000℃,因而造成空氣急劇膨脹,通道附近的氣壓可增至一百個(gè)大氣壓以上。緊接著,又發(fā)生迅速冷卻,空氣很快收縮,壓力減低。這一驟脹驟縮都發(fā)生在千分之幾秒的短暫時(shí)間內(nèi),所以在閃電爆發(fā)的一剎那間,會(huì)產(chǎn)生沖擊波。沖擊波以5000米/秒的速度向四面八方傳播,在傳播過程中,它的能量很快衰減,而波長則逐漸增長。在閃電發(fā)生后0.1-0.3秒,沖擊波就演變成聲波,這就是我們聽見的雷聲。 
            還有一種說法,認(rèn)為雷鳴是在高壓電火花的作用下,由于空氣和水汽分子分解而形成的爆炸瓦斯發(fā)生爆炸時(shí)所產(chǎn)生的聲音。雷鳴的聲音在最初的十分之幾秒時(shí)間內(nèi),跟爆炸聲波相同。這種爆炸波擴(kuò)散的速度約為5000米/秒,在之后0.
            1-0.3秒鐘,它就演變?yōu)槠胀暡ā?nbsp;
               

               人們常說的炸雷,一般是距觀測者很近的云對(duì)地閃電所發(fā)出的聲音。在這種情況下,觀測者在見到閃電之后,幾乎立即就聽到雷聲;有時(shí)甚至在閃電同時(shí)即聽見雷聲。因?yàn)殚W電就在觀測者附近,它所產(chǎn)生的爆炸波還來不及演變成普通聲波,所以聽起來猶如爆炸聲一般。 


              如果云中閃電時(shí),雷聲在云里面多次反射,在爆炸波分解時(shí),又產(chǎn)生許多頻率不同的聲波,它們互相干擾,使人們聽起來感到聲音沉悶,這就是我們聽到的悶雷。一般說來,悶雷的響度比炸雷來得小,也沒有炸雷那么嚇人。 
            拉磨雷是長時(shí)間的悶雷。雷聲拖長的原因主要是聲波在云內(nèi)的多次反射以及遠(yuǎn)近高低不同的多次閃電所產(chǎn)生的效果。此外聲波遇到山峰、建筑物或地面時(shí),也產(chǎn)生反射。有的聲波要經(jīng)過多次反射。這多次反射有可能在很短的時(shí)間間隔內(nèi)先后傳入我們的耳朵。這時(shí),我們聽起來,就覺得雷聲沉悶而悠長,有如拉磨之感。

                 黃色標(biāo)注部分為雷聲轟隆隆的原因,解釋的挺容易讓人接受的,我現(xiàn)在回憶昨天看到的閃電和聽到的雷聲,好像是聲波不斷反射傳入我耳朵里的結(jié)果,最后聲波慢慢消失,就聽不到了!
                 現(xiàn)在我又回想了下當(dāng)時(shí)同學(xué)問問題時(shí)候場景,如果當(dāng)時(shí)能夠從我現(xiàn)在的角度出發(fā),結(jié)合到動(dòng)態(tài)規(guī)劃知識(shí),就可能會(huì)回答出問題了。。。首先,最優(yōu)子結(jié)構(gòu)為聲源發(fā)出聲波傳入我耳朵里(這個(gè)很明顯能知道);然后聲波遇到障礙物反射(其實(shí)可以看做新的聲源),再次傳入我的耳朵,不過音量會(huì)變小(這個(gè)過程和最優(yōu)子結(jié)構(gòu)性質(zhì)是相同,當(dāng)然能夠想到這一步才能回答出同學(xué)問題,但是從最優(yōu)子結(jié)構(gòu)是可以猜想后來雷聲轟隆隆的);最后就有不同的反射聲波傳入我的耳朵,聽到轟隆隆混雜的聲音! 
                 可惜沒有如果,不過我現(xiàn)在知道了也好,雖然我同學(xué)當(dāng)時(shí)沒有告訴我原因,但是他告訴我怎么測聲源的位置,聲音的速度是340米每秒,從閃電發(fā)光的時(shí)候,開始數(shù)秒設(shè)為t,340*t就是數(shù)秒人與聲源的距離了(解釋是聲速與光速差太多了,所以光傳入眼睛的時(shí)間可以看做是聲源發(fā)出聲音的時(shí)間,這也是為什么打雷的時(shí)候先看到閃電,后聽到雷聲的原因)。
                 解釋了這些,我還有一點(diǎn)不清楚,就是經(jīng)常聽見飛機(jī)在天上飛,但是一抬頭飛機(jī)卻在另一個(gè)地方!!!
            posted @ 2010-09-10 11:25 jince 閱讀(1870) | 評(píng)論 (0)編輯 收藏
                 摘要: 均分紙牌 Time Limit:1000MS  Memory Limit:65536KTotal Submit:241 Accepted:103 Description 有 N 堆紙牌,編號(hào)分別為 1,2,…, N。每堆上有若干張,但紙牌總數(shù)必為 N 的倍數(shù)。可以在任一堆上取若干張紙牌,然后移動(dòng)。移牌規(guī)則為:在編號(hào)為 1 堆上取的紙牌,只能移到編號(hào)為 2 的堆上;在...  閱讀全文
            posted @ 2010-09-09 13:00 jince 閱讀(2934) | 評(píng)論 (2)編輯 收藏
                        弄了一個(gè)早上的最接近點(diǎn)對(duì),沒弄明白。。。還是做點(diǎn)簡單的吧!
            代碼如下:
            #include<stdio.h>
            #include
            <stdlib.h>
            #include
            <time.h>
            #include
            <iostream>
            using namespace std;
            int main()
            {
                
            int magic,i;
                srand(time(NULL));
            //srand()需包含頭文件stdlib.h,種子!

                printf(
            "RAND_MAX=%d\n",RAND_MAX);//原來RAND_MAX是個(gè)常量32767;rand()函數(shù)的返回值范圍:0~32767

                
            for(i=1;i<10;i++)//輸出十個(gè)1~100隨機(jī)數(shù)
                {
                    magic
            =rand()/(int)(((unsigned)RAND_MAX+1)/100);
                 
            //   magic=rand()%100+1;//課堂上老師說這樣可以取1~100之間的隨機(jī)數(shù),今天才明白原來是跟100取余的結(jié)果!
                    printf("%d ",magic);
                }

                printf(
            "\n");

                
            double a[10];

                
            for(i=0;i<10;i++)                
                    a[i]
            =(double)rand()/RAND_MAX;//這樣寫可以變成小數(shù)!

                
            for(i=0;i<10;i++)
                    printf(
            "%.2lf ",a[i]);

                printf(
            "\n");
                
            return 0;
            }
                     
            posted @ 2010-09-08 12:43 jince 閱讀(390) | 評(píng)論 (2)編輯 收藏
                     簡單的問題串聯(lián)可以組成復(fù)雜!
                     給定已經(jīng)排好序的n個(gè)元素a[0...n-1],現(xiàn)在在這n個(gè)元素中找出一特定元素x。
            代碼如下:
            #include<stdio.h>
            #include
            <iostream>
            #include
            <algorithm>
            using namespace std;
            template 
            <class Type>
            int BinarySearch(Type a[],Type& x,int n)
            {
                
            int left=0;
                
            int right=n-1;

                
            while(left<=right)
                
            {
                    
            int middle=(left+right)/2;

                    
            if(x==a[middle])
                        
            return middle;

                    
            if(x>middle)
                        left
            =middle+1;

                    
            else
                        right
            =middle-1;
                }

                
            return -1;
            }


            template 
            <class Type>      //重載
            int BinarySearch(Type a[],Type& x,int left,int right)
            {
                
            int middle=(left+right)/2;

                
            if(x==a[middle])
                    
            return middle;

                
            else if(x>middle)
                    
            return BinarySearch(a,x,middle+1,right);

                
            else
                    
            return BinarySearch(a,x,left,middle-1);

                
            return -1;
            }


            int main()
            {
                
            int i,n,x;
                
            int a[100];
                
            while(scanf("%d",&n)!=EOF)
                
            {
                    
            for(i=0;i<n;i++)
                        scanf(
            "%d",&a[i]);

                    sort(a,a
            +n);

                    
            for(i=0;i<n;i++)
                        printf(
            "%d ",a[i]);
                    printf(
            "\n");

                    scanf(
            "%d",&x);

                    printf(
            "%d\n",BinarySearch(a,x,n));

                    printf(
            "%d\n",BinarySearch(a,x,0,n-1));
                }

                
            return 0;
            }

            運(yùn)行結(jié)果:

            posted @ 2010-09-07 22:42 jince 閱讀(208) | 評(píng)論 (0)編輯 收藏
                     我們不斷做著把事情翻譯成語言的工作!
                     漢諾塔老生常談的問題!
                     個(gè)人體會(huì):一、理解函數(shù)意義和數(shù)據(jù)意義!
                                         二、想象力,就像把一棵二叉樹先展開,再收攏!
                     直接上代碼(注釋以前寫的):
            #include<stdio.h>
            int count1,count;//count1,表示第一個(gè)圓盤移動(dòng)的次數(shù)
                             
            //count,表示總的移動(dòng)次數(shù)

            /*函數(shù)功能:限制移動(dòng)過程
              函數(shù)參數(shù): 整形變量num,表示第n個(gè)盤子
                       自發(fā)性變量 from,表示源木樁
                       字符型變量to,表示目的木樁
                       
            */


            void move(int num,char from,char to)
            {
                printf(
            "move %d:from %c to %c\n",num,from,to);
                count
            ++;
            }


            /*函數(shù)功能:將第n個(gè)盤子從源木樁A,借助于木樁C移動(dòng)到木樁B
            函數(shù)參數(shù):n,表示第n個(gè)盤子
                      a,表示源木樁a
                      b,表示目的木樁b
                      c,表示過度木樁c
            */


            /*我自己想法:
                   三個(gè)木樁,從第n個(gè)盤開始移動(dòng),只有當(dāng)其他的盤都在c木樁才能移動(dòng)n,
                   同理要將第n-1個(gè)盤從c移動(dòng)到b,要將n-2個(gè)盤全部移動(dòng)到a木樁
            */




            void hanoi(int n,char a,char b,char c)
            {
                
            if(n==1)                         //遞歸出口:為什么是n==1?
                {                                
                    move(n,a,b);                 
            //第n個(gè)盤子由a->b
                    count1++;
                }

                
            else
                
            {
                    hanoi(n
            -1,a,c,b);            //將第n-1個(gè)盤子,借助于b由a->c   
                    move(n,a,b);                 //第n個(gè)盤子有a->b
                    hanoi(n-1,c,b,a);            //將第n-1個(gè)盤子,借助于a有c->b
                }

            }



            int main()
            {
                    
            int  n;
                    
            while(n!=0)
                    
            {
                         scanf(
            "%d",&n);
                        hanoi(n,
            'A','B','C');
                        printf(
            "count=%d\n",count);
                        printf(
            "count1=%d\n",count1);
                    }

                    
            return 0;
            }



            /*通過程序運(yùn)行,我們還可以得到:
                        當(dāng)n為偶數(shù)時(shí),第一個(gè)盤第一次移動(dòng)移動(dòng)到c,
                        當(dāng)n為奇數(shù)時(shí),第一個(gè)盤第一次移動(dòng)到移動(dòng)到b
            */

            運(yùn)行結(jié)果:
            posted @ 2010-09-07 21:56 jince 閱讀(228) | 評(píng)論 (0)編輯 收藏
                     有n=2^k個(gè)運(yùn)動(dòng)員比賽,現(xiàn)要求設(shè)計(jì)一張比賽日程表,要求如下:
                    (1)每個(gè)選手必須與其他n-1個(gè)選手各比賽一次;
                    (2)每個(gè)選手一天只能比賽一次;
                    (3)循環(huán)賽一共進(jìn)行n-1天;
                     這個(gè)題目自己列下表,觀察一下規(guī)律就成,書上說的二分不是那么好理解!重在實(shí)際應(yīng)用。。。
            代碼如下:
            #include<stdio.h>

            void   Table(int k,int a[][100])
            {
                
            int n=1;
                
            int i,j,s,t;
                
            for(i=1;i<=k;i++)
                    n
            *=2;
                
            for(i=1;i<=n;i++)
                    a[
            1][i]=i;
                
            int m=1;
                
            for(s=1;s<=k;s++)
                
            {
                    n
            /=2;
                    
            for(t=1;t<=n;t++)
                        
            for(i=m+1;i<=2*m;i++)
                            
            for(j=m+1;j<=2*m;j++)
                            
            {
                                a[i][j
            +(t-1)*m*2]=a[i-m][j+(t-1)*m*2-m];
                                a[i][j
            +(t-1)*m*2-m]=a[i-m][j+(t-1)*m*2];
                            }

                    m
            *=2;
                }

            }


            int main()
            {
                
            int a[100][100];
                Table(
            3,a);
                
            int i,j;
                
            for(i=1;i<=8;i++)
                
            {
                    
            for(j=1;j<=8;j++)
                        printf(
            "%d ",a[i][j]);
                    printf(
            "\n");
                }

                
            return 0;
            }

            結(jié)果:
            posted @ 2010-09-07 20:53 jince 閱讀(242) | 評(píng)論 (0)編輯 收藏

                     最大公約的兩種求法:
                     代碼如下:
            #include<stdio.h>
            int gcds(int a,int b)//stein算法
            {

                    
            if(a<b){
                        
            int temp = a;
                        a 
            = b;
                        b
            =temp;
                    }


                    
            if(0==b)              //b=0返回
                    return a;

                    
            if(a%2==0 && b%2 ==0//a和b都是偶數(shù)
                    return 2*gcds(a/2,b/2);

                    
            if ( a%2 == 0)        // a是偶數(shù),b是奇數(shù)
                    return gcds(a/2,b);

                    
            if ( b%2==0 )         // a是奇數(shù),b是偶數(shù)
                    return gcds(a,b/2);

                    
            return gcds((a+b)/2,(a-b)/2);// a和b都是奇數(shù)
            }


            int gcdo(int a,int b)    //歐幾里得
            {

                    
            if(b==0)
                        
            return a;

                    
            if(a<b){
                        
            int temp = a;
                        a 
            = b;
                        b
            =temp;
                    }

                    
            return gcdo(b,a%b);   
            }

            int main()
            {
                
            int a,b;
                
            while(scanf("%d %d",&a,&b)!=EOF)
                
            {
                    printf(
            "%d\n%d\n",gcds(a,b),gcdo(a,b));
                }

                
            return 0;
            }

                  歐幾里得算法,當(dāng)初老師給我們的時(shí)候,只是說這樣求可以求得最大公約數(shù),沒給出證明。。
                 百度上搜了一下,基本證明思想a,b(a>b)的公約數(shù)和a,a%b的公約數(shù)是相同的。Stein算法證明也類似!!
            posted @ 2010-09-07 12:09 jince 閱讀(772) | 評(píng)論 (0)編輯 收藏
                     苦惱啊!

            Description

            設(shè)有n個(gè)正整數(shù),將他們連接成一排,組成一個(gè)最大的多位整數(shù)。例如:n=3時(shí),3個(gè)整數(shù)13,312,343,連成的最大整數(shù)為:34331213

            又如:n=4時(shí),4個(gè)整數(shù)7,13,4,246連接成的最大整數(shù)為7424613

            Input

            N
            N個(gè)數(shù)

            Output

            連接成的多位數(shù)

            Sample Input

            3
            13 312 343
            0

             

            Sample Output

            34331213
                  這個(gè)題目意思應(yīng)該很好理解,至少會(huì)想有兩種解題思路,
                     一、把數(shù)組從大到小排列,這樣是最大嗎?  顯然不是,例如:123 9,應(yīng)該輸出9123;
                     二、把數(shù)組按字符串排序,這樣是最大嗎?這問題可能會(huì)然我們困惑,但是這也是錯(cuò)的,例如:120,12;應(yīng)該輸出12120;
            這個(gè)題目不知道毒害了多少人(當(dāng)然我指的是ACM新人),尤其是第二種思路去寫代碼的。。這只是一個(gè)悲劇的開始,你把一條彎路在直走!
            其實(shí)這個(gè)題目應(yīng)該是屬于動(dòng)態(tài)規(guī)劃的最簡單應(yīng)用!子問題,給你兩個(gè)數(shù),讓你連成最大數(shù),一定非常簡單,只能組成兩個(gè)數(shù),比較一下大小就成!這就是解題思路!
            如果給你三個(gè)數(shù)呢?一直遞推下去!悲劇啊,盡然怎么簡單!
            代碼如下:


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

            int main()
            {
                
            int n,i,j,l,k;
                
            char s[1000][100];
                
            char s1[200],s2[200];
                
            while(scanf("%d",&n)!=EOF&&n!=0)
                
            {
                    
            for(i=0;i<n;i++)
                    
            {
                        scanf(
            "%s",s[i]);
                        
            while(s[i][0]=='0')
                        
            {
                            
            if(strlen(s[i])==1)
                                
            break;
                            strcpy(s[i],s[i]
            +1);
                        }

                    }

                    
            for(i=0;i<n;i++)
                    
            {            
                        
            for(j=i+1;j<n;j++)
                        
            {
                            strcpy(s1,s[i]);
                            strcat(s1,s[j]);
                            strcpy(s2,s[j]);
                            strcat(s2,s[i]);
                            
            if(strcmp(s1,s2)<0)
                            
            {
                                strcpy(s1,s[i]);
                                strcpy(s[i],s[j]);
                                strcpy(s[j],s1);
                            }

                        }

                    }

                    
            for(i=0;i<n;i++)
                    
            {
                        
            if(s[0][0]=='0')
                        
            {
                            printf(
            "0");
                            
            break;
                        }

                        
            else
                        
            {
                            printf(
            "%s",s[i]);
                        }

                    }

                    printf(
            "\n");
                }

                
            return 0;
            }



            本來我也是第二種思路的,我看了感覺不像,因?yàn)橐郧皩戇^了!
            早上的幾點(diǎn)收獲:
            1、<string>頭文件和<string.h>頭文件是不一樣的!運(yùn)行時(shí)的一個(gè)錯(cuò)誤,弄了一個(gè)早上,最后發(fā)現(xiàn)這什么個(gè)問題!
            2、運(yùn)用容器,排序字符串
             
            
                vector<string> words;
                
            string str;
                
            while(scanf("%s",str)!=EOF)  
                    words.push_back(str);

                sort(words.begin(),words.end(),greater
            <string>());


                
            for(vector<string>::size_type i=0;i<words.size();i++)
                
            {
                        cout
            <<words[i]<<endl;
                }

            不過會(huì)有很多警告,讓我很苦惱!有誰知道呢?
            警告如下:
            --------------------Configuration: rongqi - Win32 Debug--------------------
            Compiling
            rongqi.cpp
            c:\documents and settings\administrator\桌面\rongqi\rongqi.cpp(
            81) : warning C4786: 'std::reverse_iterator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const *,std::basic_string<char,std::char_traits<char>,std::allocator<char
            > >,std::basic_string<char,std::char_traits<char>,std::allocator<char> > const &,std::basic_string<char,std::char_traits<char>,std::allocator<char> > const *,int>' : identifier was truncated to '255' characters in the debug information
            c:\documents and settings\administrator\桌面\rongqi\rongqi.cpp(81) : warning C4786: 'std::reverse_iterator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > *,std::basic_string<char,std::char_traits<char>,std::allocator<char> >,st
            d::basic_string<char,std::char_traits<char>,std::allocator<char> > &,std::basic_string<char,std::char_traits<char>,std::allocator<char> > *,int>' : identifier was truncated to '255' characters in the debug information
            c:\program files\microsoft visual studio\vc98\include\vector(39) : warning C4786: 'std::vector<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >
             >::vector<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >' : identifier was truncated to '255' characters in the debug information
            c:\program files\microsoft visual studio\vc98\include\vector(60) : warning C4786: 'std::vector<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >
             >::~vector<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >' : identifier was truncated to '255' characters in the debug information

            rongqi.obj 
            - 0 error(s), 0 warning(s)
            3、在程序頭上寫#pragma   warning  (disable:   4786),可以注銷4786以后警告!
            posted @ 2010-09-06 11:52 jince 閱讀(890) | 評(píng)論 (0)編輯 收藏
            僅列出標(biāo)題
            共6頁: 1 2 3 4 5 6 
            哈哈哈哈哈哈
            久久久久久亚洲精品无码| 久久天天躁狠狠躁夜夜2020老熟妇| 日本国产精品久久| 九九精品久久久久久噜噜| 亚洲国产精品无码久久一线| 国产精品禁18久久久夂久| 爱做久久久久久| 亚洲综合精品香蕉久久网| 久久精品国产亚洲网站| 无码国内精品久久人妻麻豆按摩 | 热综合一本伊人久久精品| 伊人久久大香线蕉成人| 99热成人精品热久久669| 久久国产亚洲精品| 久久这里只有精品久久| 亚洲精品午夜国产VA久久成人| 伊人久久精品线影院| 色诱久久久久综合网ywww| 久久久久这里只有精品| 久久99精品国产99久久| 日日噜噜夜夜狠狠久久丁香五月| 久久综合久久综合九色| 久久99国产精品尤物| 77777亚洲午夜久久多喷| 色综合久久久久综合99| 精品久久久久久久久久中文字幕 | 99久久精品国产麻豆| 性做久久久久久久| A级毛片无码久久精品免费| 久久久久亚洲精品天堂久久久久久 | 久久精品国产亚洲Aⅴ蜜臀色欲| 久久久免费精品re6| 久久久久久九九99精品| 亚洲va中文字幕无码久久不卡| 久久精品视频一| 99精品久久久久久久婷婷| 一本一道久久a久久精品综合 | 亚洲国产成人久久综合碰| 久久久久婷婷| 一级做a爰片久久毛片看看| 色综合久久中文字幕综合网 |