• <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 西月弦 閱讀(545) 評論(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函數,終于明白代碼的含義了....  回復  更多評論
              
            精品久久久无码人妻中文字幕| 亚洲级αV无码毛片久久精品| 国产精品久久免费| 精品久久久久国产免费| 一极黄色视频久久网站| 国产精品视频久久| 久久亚洲精品国产精品婷婷| 精品久久久久久成人AV| 亚洲伊人久久成综合人影院 | 久久久久久极精品久久久| 亚洲中文字幕久久精品无码喷水| 欧美亚洲另类久久综合| 伊人久久大香线焦AV综合影院| 青青草原1769久久免费播放| 亚洲人成网亚洲欧洲无码久久 | 久久97久久97精品免视看| 久久无码人妻一区二区三区午夜| 久久久久人妻精品一区三寸蜜桃| 99久久超碰中文字幕伊人| 国内精品久久久久久久久电影网| 国产福利电影一区二区三区久久老子无码午夜伦不 | 久久精品国产亚洲av麻豆蜜芽| 国内精品久久久久久中文字幕| 99久久久国产精品免费无卡顿| 久久国语露脸国产精品电影| 中文字幕久久亚洲一区| 久久精品国产一区二区三区不卡 | 久久国产精品视频| 99久久国产综合精品网成人影院| 精品久久久久久无码专区 | 国产精品欧美久久久天天影视| 色偷偷久久一区二区三区| 综合久久国产九一剧情麻豆| 亚洲精品国产第一综合99久久| 77777亚洲午夜久久多喷| 久久99久国产麻精品66| 中文字幕无码精品亚洲资源网久久 | 久久国产免费观看精品| 伊人色综合久久| 久久精品这里只有精99品| 很黄很污的网站久久mimi色|