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 };
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 };
原文:http://www.cnblogs.com/yzcstc/p/3602572.html