• <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>
            算法學社
            記錄難忘的征途
            posts - 141,comments - 220,trackbacks - 0
            A題

            分兩部分求,因為題目數只有15,所以可以2^15枚舉分組情況(分給L還是分給M)。

            接下來求對于同一size的M種顏色的氣球分配給N個題目的最小代價。
            排序之后,從大到小貪心的分配就可以了。

             1 #include<iostream>
             2 #include<string>
             3 #include<vector>
             4 using namespace std;
             5 const int inf = ~0u>>2;
             6 int make(vector<int> &flag, vector<int> &num){
             7     int n = num.size(), m = flag.size(),len = min(n,m);
             8     int suma  = 0, sumb = 0;
             9     for(int i = 0; i < n; i++) suma += num[i];
            10     for(int i = 0; i < m; i++) sumb += flag[i];
            11     if(suma > sumb) return inf;
            12     for(int i = 0; i < len; i++) suma -= min(num[i],flag[i]);
            13     return suma;
            14 }
            15 bool cmp(int a,int b){return a>b;}
            16 void op(vector<int> s){
            17     for(int i = 0; i < s.size(); i++)cout<<s[i]<<" ";cout<<endl; 
            18 }
            19 class ICPCBalloons{
            20     public :
            21     int minRepaintings(vector <int> bC, string bS, vector <int> num){
            22         int n= num.size();
            23         vector<int> M ,L;
            24         for(int i =0; i < bS.size(); i++if(bS[i] == 'L') L.push_back(bC[i]); else M.push_back(bC[i]);
            25         sort(M.begin(),M.end(),cmp);
            26         sort(L.begin(),L.end(),cmp);
            27         sort(num.begin(),num.end(),cmp);
            28         cout<<"M: "<<endl; op(M);
            29         cout<<"L: "<<endl; op(L);
            30         int ans = inf;
            31         for(int i = 0; i < (1<<n); i++) {
            32             vector<int> m,l;
            33             for(int j = 0; j < n; j++if(1<<& i) m.push_back(num[j]); else l.push_back(num[j]);
            34             int a = make(M,m);
            35             int b = make(L,l);
            36             //cout<<"m: "<<endl; op(m);
            37             //cout<<"l: "<<endl; op(l);
            38             ans = min(ans,a+b);
            39         }
            40         return ans == inf ? -1 : ans;
            41     }
            42 };

            B題

            博弈,給若干個有根樹,節點數不超過50,兩個人輪流給某個未染色的點染色,這個點一旦被染色,它以及它的所有祖先就都被染色了。
            問先手勝還是后手勝。

            樹形DP求SG值,復雜度O(n^3)。非常裸...
            更大規模的解法見 
            http://www.2333333.tk/182.html


            #include<string>
            #include
            <iostream>
            #include
            <vector>
            #include
            <cmath>
            using namespace std;
            const int N = 55;
            int P[N] ,n, dp[N];
            vector
            <int> G[N];
            inline 
            void setc(int p,int c){P[c] = p;
                G[p].push_back(c);
            }
            bool ispar(int s,int p){
                
            while(s!=-1){if(s==p)return 1; s=P[s];} return 0;
            }
            int dfs(int u) {
            //    cout<<"u; "<<u<<endl;
                int &ans = dp[u];
                
            if(ans != -1) {
                    
            //cout<<"back"<<endl;
                    return ans;
                }
                
            bool vis[101= {0};
                
            for(int i = 0; i < n; i++if(ispar(i,u)) {
                
            //    cout<<"i: "<<i<<endl;
                    int v = i, last = -1 ,sg = 0;
                    
            while(v != P[u]) {
                        
            for(int j = 0; j < G[v].size(); j ++if(G[v][j] != last) sg ^= dfs(G[v][j]);
                        last 
            = v;
                        v 
            = P[v];
                    }
                    vis[sg] 
            = 1;
                }
                
            for(int i = 0; i < 101; i++if(!vis[i]) {ans = i; break;}
                
            //cout<<"back"<<endl;
                return ans;
            }
            double dis(int x0,int y0,int x1,int y1){return sqrt(1.0*(x0-x1)*(x0-x1) + 1.0*(y0-y1)*(y0-y1));}
            class CirclesGame{
                
            public
                
            string whoCanWin(vector <int> x, vector <int> y, vector <int> r){
                    memset(P,
            -1,sizeof(P));
                    memset(dp,
            -1,sizeof(dp));
                    n 
            = x.size();
                    
            for(int i  =0 ; i < n; i++) {
                        
            int s = -1;
                        
            for(int j= 0; j < n; j++if(j != i && 1.0*(r[j] - r[i]) > dis(x[i],y[i],x[j],y[j])){
                            
            //cout<<j<<" "<<i<<" "<<r[j]-r[i]<<" "<<dis(x[i],y[i],x[j],y[j])<<endl;
                            if(s == -1 || r[j] < r[s]) s = j;
                        }
                        
            if(s != -1){     
                            setc(s,i);
                        }
                    }
                    
            //cout<<"endl"<<endl;
                
            //    for(int i = 0; i < n; i++) cout<<P[i]<<" ";cout<<endl;
                    int ans = 0;
                    
            for(int i = 0; i < n; i++if(-1 == P[i]) ans ^= dfs(i);
                    
            return ans ? "Alice" : "Bob";
                }
            };
            posted on 2012-11-21 16:02 西月弦 閱讀(522) 評論(3)  編輯 收藏 引用 所屬分類: 解題報告

            FeedBack:
            # re: topcoder srm 561 div1[未登錄]
            2012-11-23 13:14 | kaka
            不是很明白,能不能詳細說一下第二題的思路?  回復  更多評論
              
            # re: topcoder srm 561 div1
            2012-11-24 14:30 | 西月弦
            @kaka
            這個... 就是對于每個局面計算SG值。  回復  更多評論
              
            # re: topcoder srm 561 div1[未登錄]
            2012-11-24 20:57 | kaka
            @西月弦
            看完sg函數,終于明白代碼的含義了....  回復  更多評論
              
            久久亚洲AV成人无码电影| 亚洲精品国精品久久99热| 99久久精品国产麻豆| 九九99精品久久久久久| 色综合久久久久综合99| 性色欲网站人妻丰满中文久久不卡| 99久久人妻无码精品系列| 深夜久久AAAAA级毛片免费看| 亚洲第一极品精品无码久久| 91精品婷婷国产综合久久| 久久精品免费一区二区| 国产精品美女久久久久久2018| 久久精品国产秦先生| 久久无码AV中文出轨人妻| 潮喷大喷水系列无码久久精品| 欧美日韩成人精品久久久免费看| 久久精品国产亚洲AV电影| 久久综合精品国产一区二区三区 | 久久久亚洲欧洲日产国码aⅴ| 国产精品狼人久久久久影院| 伊人久久综合精品无码AV专区| 久久伊人精品青青草原高清| 久久人人爽人人爽人人爽| 免费一级做a爰片久久毛片潮| 99久久精品国产一区二区三区 | 中文字幕无码免费久久| 亚洲精品高清久久| 久久99国产精品久久| 精品久久久噜噜噜久久久 | 久久精品国产只有精品2020| 国产69精品久久久久APP下载| 国内精品久久国产大陆| 2021少妇久久久久久久久久| 99久久国产热无码精品免费| 久久夜色精品国产噜噜亚洲AV| 久久精品国产久精国产一老狼| 一本一道久久a久久精品综合| 性做久久久久久免费观看| 欧美一级久久久久久久大| 中文字幕无码av激情不卡久久| 亚洲国产婷婷香蕉久久久久久|