• <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>
            算法學(xué)社
            記錄難忘的征途
            posts - 141,comments - 220,trackbacks - 0
            吐槽:
                1. 真的是本年度變黃的最好機(jī)會,但是被我白白浪費(fèi)了。。。。
                2. Orz mzry
            A. Clear Symmetry

                定義一個01矩陣X,長和高相等且同時擁有兩個性質(zhì):
                    1. 含有1的格子不相鄰
                    2. 對于任意的格子 X[i][j] 有 X[i][j]==X[n-1-i][j] && X[i][j] == X[i][m-1-j]
                給你一個數(shù)n,求最小的恰好包含n個1的矩陣X的邊長。

            算法分析:

                猜結(jié)論,首先發(fā)現(xiàn)偶數(shù)的情況應(yīng)該是不可能的。
                然后猜測解的分布是連續(xù)的。有個特例是n=3。
             1 #include<iostream>
             2 using namespace std;
             3 int num[100];
             4 int main(){
             5     int len = 1;
             6     num[0] = 1;
             7     do{
             8         num[len] = num[len-1] + len*4;
             9         len ++;
            10     } while(num[len-1] <=100);
            11     int n;
            12     while(cin >> n){
            13         int i=0;
            14         if(n==3) {cout<<5<<endl;continue;}
            15         for(;n > num[i];i++); 
            16         cout<<2*i+1<<endl;
            17     }
            18 }
            19 
            B. Guess That Car!
                 有一個矩陣C。位置(x,y)與(i,j)的權(quán)值是 C[i][j] * ( (|x-i|*4+2)^2 + (|y-j|*4+2)^2 )。
                 要求求出最佳位置x,y使所有位置與x,y的權(quán)值和最小。

            算法分析:

                正解是分別預(yù)處理x和y,然后依次檢查。
                我的方法是直接用 d^2*c 和 d*c的關(guān)系去依次維護(hù)d^2*c。這個方法非常蠢,但是居然被我想到了臥槽 = =!
                易疵點(diǎn)是最大值的不容易選取,因?yàn)榻Y(jié)果會很大。
             1 #include<iostream>
             2 #include<cstdio>
             3 #include<cstring>
             4 using namespace std;
             5 typedef long long ll;
             6 const int N = 1005;
             7 int num[N][N];
             8 ll sumc, sumxc,sumx[N],sumy[N],now;
             9 ll dist(ll w,ll h){
            10     return w*w + h*h;
            11 }
            12 int main(){
            13     int n,m;
            14     while(cin >> n >> m){
            15         sumc = now = 0;
            16         for(int i=0;i<n;i++)
            17             for(int j=0;j<m;j++){
            18                 scanf("%d",&num[i][j]);
            19                 now += num[i][j] * dist(i*4+2, j*4+2);
            20                 sumc += num[i][j];
            21             }
            22         for(int i=0;i<n;i++) sumx[i] = 0;
            23         for(int i=0;i<m;i++) sumy[i] = 0;
            24         for(int i=0;i<n;i++)
            25             for(int j=0;j<m;j++)
            26                 sumx[i] += num[i][j] ,
            27                 sumy[j] += num[i][j] ;
            28         ll nowx, nowy, sumyc = 0, ans = -1;
            29         for(int i=0;i<n;i++)
            30             sumyc += (i*4+2) * sumx[i];
            31         ll myxc = 0;
            32         int x,y;
            33         for(int i=0;i<m;i++)
            34             myxc += (i*4+2) * sumy[i];
            35         for(int i=0;i<=n;i++){
            36             if(i==0) nowx = now;
            37             else {
            38                 nowx += 16*sumc - 8*sumyc;
            39                 sumyc -= 4*sumc;
            40             }
            41             sumxc = myxc;
            42             for(int j=0;j<=m;j++){
            43                 if(j==0) nowy = nowx;
            44                 else {
            45                     nowy += 16*sumc - 8*sumxc;
            46                     sumxc -= 4*sumc;
            47                 }
            48                 if(ans == -1 || ans > nowy){
            49                     ans = nowy;
            50                     x = i; y = j;
            51 //                    cout<<i<<" "<<j<<endl;
            52                 }
            53             }
            54         }
            55         cout<<ans<<endl;
            56         cout<<x<<" "<<y<<endl;
            57     }
            58 }
            59 
            C. Fragile Bridges

                有n個點(diǎn)排成一行,每兩個點(diǎn)有一個權(quán)值。 現(xiàn)在讓你遍歷這些點(diǎn),每一次經(jīng)過兩點(diǎn)的時候,兩點(diǎn)之間的權(quán)值就會 -1。 你的得分會+1。不允許經(jīng)過權(quán)值為0的邊。
                你可以自由選取出發(fā)點(diǎn),使得分最多。求最多的得分。

            算法分析:

                dpl[i][p],當(dāng)p = 0時,dp[i]代表從i出發(fā)遍歷 0 - i的點(diǎn),能得到的最大得分。
                當(dāng)p = 1時, dp[i]代表從i出發(fā)遍歷0-i, 最后回到i的最大得分。
                dpr同理。 最后枚舉每個出發(fā)點(diǎn)。O(n)復(fù)雜度。
                但是忘了當(dāng)邊長為1的時候是不能回頭的,于是fail system test。 錯過了變黃的最好機(jī)會啊!!!
             1 #include<iostream>
             2 #include<cstdio>
             3 using namespace std;
             4 typedef long long ll;
             5 const int N = 100005;
             6 int num[N];
             7 ll dpl[N][2], dpr[N][2];
             8 int main(){
             9     int n;
            10     cin >> n;
            11     for(int i=0;i<n-1;i++)
            12         scanf("%d",&num[i]);
            13     dpl[0][0] = dpl[0][1] = 0;
            14     for(int i=1;i<n;i++){
            15         dpl[i][1] = (num[i-1] > 1 ? num[i-1]/2*2 + dpl[i-1][1] : 0);
            16         if(num[i-1] & 1) dpl[i][0] = dpl[i-1][0] + num[i-1] ;
            17         else dpl[i][0] = max( dpl[i][1] , dpl[i-1][0] + num[i-1] -1);
            18     }
            19     dpr[n-1][0] = dpr[n-1][1] = 0;
            20     for(int i=n-2;i>=0;i--){
            21         dpr[i][1] = (num[i] > 1 ? num[i]/2*2 + dpr[i+1][1] : 0);
            22         if(num[i] & 1) dpr[i][0] = num[i] + dpr[i+1][0];
            23         else dpr[i][0] = max(dpr[i][1], dpr[i+1][0] + num[i]-1);
            24     }
            25     ll ans = 0;
            26     for(int i=0; i<n;i++){
            27 //        cout<<"l: "<<dpl[i][0]<<" "<<dpl[i][1]<<" r: "<<dpr[i][0]<<" "<<dpr[i][1]<<endl;
            28         ll v1 = max(dpl[i][0],dpr[i][0]);
            29         ll v2 = max(dpl[i][1]+dpr[i][0],dpr[i][1]+dpl[i][0]);
            30         ans = max(ans,max(v1,v2));
            31     }
            32     cout<<ans<<endl;
            33 }
            34 
            posted on 2012-06-30 02:49 西月弦 閱讀(540) 評論(0)  編輯 收藏 引用 所屬分類: 解題報告
            久久久久国产精品| 久久综合久久综合久久| 久久精品国产亚洲AV不卡| 久久久久久九九99精品| 99蜜桃臀久久久欧美精品网站 | 99久久精品国内| 99久久精品国产一区二区| 色天使久久综合网天天| 久久久精品人妻无码专区不卡| 青青青伊人色综合久久| 国产精品视频久久久| 99久久99久久久精品齐齐| 久久精品无码专区免费青青| 热re99久久6国产精品免费| 无码精品久久久久久人妻中字| 久久久久久久久久久久中文字幕| 久久精品人成免费| 精品国产一区二区三区久久| 亚洲国产精品久久66| 一本色道久久88综合日韩精品| 中文字幕无码久久久| 亚洲色欲久久久综合网| 久久亚洲私人国产精品| yellow中文字幕久久网| 性做久久久久久久久老女人| 久久久一本精品99久久精品88| 久久精品毛片免费观看| 国产精品美女久久久久AV福利| 一本色道久久综合| 久久精品欧美日韩精品| 国产99久久久国产精品~~牛| 狠狠色丁香婷婷久久综合| 狠狠干狠狠久久| 久久久久亚洲AV无码专区首JN| 久久91精品国产91久久麻豆| 亚洲美日韩Av中文字幕无码久久久妻妇 | 欧美噜噜久久久XXX| 久久久WWW成人免费毛片| 久久精品国产色蜜蜜麻豆| 99久久婷婷国产一区二区| 久久久久久久久久久久久久|