• <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久久精品一区二区| 国产亚洲美女精品久久久久狼| 国产A级毛片久久久精品毛片| 精品久久久久久无码免费| 久久人人爽人人爽人人片av麻烦 | 2021少妇久久久久久久久久| 香蕉久久夜色精品国产小说| 三级韩国一区久久二区综合 | 国产精品久久久久9999| 人人狠狠综合88综合久久| 久久精品国产亚洲AV高清热| 精品久久久久中文字幕一区| 蜜臀av性久久久久蜜臀aⅴ| 久久91这里精品国产2020| 久久久久亚洲av无码专区导航| 久久99精品久久久久久噜噜 | 国产成人久久精品一区二区三区| 久久精品国产亚洲一区二区三区| 久久久久亚洲AV无码网站| 久久人人爽人人人人片av| 国内精品久久久久久久久电影网 | 国产A级毛片久久久精品毛片| 久久久99精品一区二区| 嫩草影院久久99| 国产精品久久久久久一区二区三区| 精品久久久久久久国产潘金莲 | 区久久AAA片69亚洲| 久久久免费观成人影院 | 亚洲中文字幕无码久久2017| 久久免费视频6| 久久无码国产| 久久精品极品盛宴观看| 久久亚洲AV无码精品色午夜麻豆 | 狠狠人妻久久久久久综合| 秋霞久久国产精品电影院| 91久久福利国产成人精品| 国产福利电影一区二区三区,免费久久久久久久精 | 国产精品久久免费| 久久综合九色综合97_久久久|