SRM470

250pt

    给定1个最多16颜色的字符串(颜色可以重复),甲在最左边,乙在最右边。轮流操作,每次可以消除一种颜色。

    给定一个k,问谁能最先消除完到位置k之间的障碍。

思路:

   每个人肯定优先取对方没有的,,所以直接模拟即可

 1 #line 7 "DoorsGame.cpp"
 2 #include <cstdlib>
 3 #include <cctype>
 4 #include <cstring>
 5 #include <cstdio>
 6 #include <cmath>
 7 #include <algorithm>
 8 #include <vector>
 9 #include <string>
10 #include <iostream>
11 #include <sstream>
12 #include <map>
13 #include <set>
14 #include <queue>
15 #include <stack>
16 #include <fstream>
17 #include <numeric>
18 #include <iomanip>
19 #include <bitset>
20 #include <list>
21 #include <stdexcept>
22 #include <functional>
23 #include <utility>
24 #include <ctime>
25 using namespace std;
26 
27 #define PB push_back
28 #define MP make_pair
29 #define two(i) (1 << i)
30 #define REP(i,n) for(i=0;i<(n);++i)
31 #define FOR(i,l,h) for(i=(l);i<=(h);++i)
32 #define FORD(i,h,l) for(i=(h);i>=(l);--i)
33 
34 typedef vector<int> VI;
35 typedef vector<string> VS;
36 typedef vector<double> VD;
37 typedef long long LL;
38 typedef pair<int,int> PII;
39 
40 
41 class DoorsGame
42 {
43         public:
44         int determineOutcome(string s, int p)
45         {
46              int n = s.size(), S = 0,  S1 = 0;
47              for (int i = 0; i < p; ++i)
48                 S |= (1 << (s[i] - 'A'));
49              for (int i = p; i < n; ++i)
50                 S1 |= (1 << (s[i] - 'A'));
51              int same = S & S1;
52              int ans = 0, j;
53              while (1){
54                   j = -1;
55                   for (int i = 0; i < 16; ++i)
56                      if (S & two(i)){
57                           if (j == -1 || !(two(i) & same)) j = i;      
58                      }
59                   S -= two(j);
60                   if (S1 & two(j)) S1 -= two(j);
61                   ++ans;
62                   if (S == 0){
63                        if (S1 == 0) return 0;
64                        return ans;
65                   }
66                   
67                   j = -1;
68                   for (int i = 0; i < 16; ++i)
69                      if (S1 & two(i)){
70                           if (j == -1 || !(two(i) & same)) j = i;      
71                      }
72                   S1 -= two(j);
73                   if (S & two(j)) S -= two(j);
74                   ++ans;
75                   if (S1 == 0){
76                        if (S == 0) return 0;
77                        return -ans;
78                   }   
79              }
80              return 0;
81         }
82 };
View Code

 

500pt

        两排点,每排n个.上排的和下排的连线.事先已经有些线连好了.求考虑所有的连线方案时,连线交点个数的期望

思路:
        三类计数:事先已经连好的线间的交点数.新增连线和原有连线的交点数期望.新增连线之间交点期望.

 1 // BEGIN CUT HERE
 2 /*
 3 
 4 */
 5 // END CUT HERE
 6 #line 7 "DrawingLines.cpp"
 7 #include <cstdlib>
 8 #include <cctype>
 9 #include <cstring>
10 #include <cstdio>
11 #include <cmath>
12 #include <algorithm>
13 #include <vector>
14 #include <string>
15 #include <iostream>
16 #include <sstream>
17 #include <map>
18 #include <set>
19 #include <queue>
20 #include <stack>
21 #include <fstream>
22 #include <numeric>
23 #include <iomanip>
24 #include <bitset>
25 #include <list>
26 #include <stdexcept>
27 #include <functional>
28 #include <utility>
29 #include <ctime>
30 using namespace std;
31 
32 #define PB push_back
33 #define MP make_pair
34 
35 #define REP(i,n) for(i=0;i<(n);++i)
36 #define FOR(i,l,h) for(i=(l);i<=(h);++i)
37 #define FORD(i,h,l) for(i=(h);i>=(l);--i)
38 
39 typedef vector<int> VI;
40 typedef vector<string> VS;
41 typedef vector<double> VD;
42 typedef long long LL;
43 typedef pair<int,int> PII;
44 
45 
46 class DrawingLines
47 {
48         public:
49         double countLineCrossings(int n, vector <int> s, vector <int> t)
50         {
51              int m = s.size();
52              double ret = (n - m) * (n - m - 1.0) / 4.0;
53              for (int i = 0; i < m; ++i)
54                for (int j = i + 1; j < m; ++j)
55                  if ((s[i] < s[j] && t[i] > t[j]) || (s[i] > s[j] && t[i] < t[j])) ret += 1.0;
56              for (int i = 0; i < m; ++i){
57                    double s1 = s[i] - 1,  s2 = n - s[i], t1 = t[i] - 1, t2 = n - t[i];
58                    for (int j = 0; j < m; ++j){
59                         if (s[j] < s[i]) --s1;
60                         if (s[j] > s[i]) --s2;
61                         if (t[j] < t[i]) --t1;
62                         if (t[j] > t[i]) --t2;
63                    }   
64                    ret += (s1 * t2 + s2 * t1) / (t1 + t2);
65              }
66              return ret;
67         }
68 
69 };
View Code

 

 

posted on 2014-03-15 22:21  yzcstc  阅读(150)  评论(0编辑  收藏  举报