CodeChef submission 83952 (C++ 4.0.0-8) plaintext list. Status: TLE, problem G1, contest SEP09. By gmark (Mark Greve), 2009-09-01 23:22:25.
// A Bowling Game // Source: CodeChef September Algorithm Challenge // CodeChef ID: G1 #include <algorithm> #include <bitset> #include <cassert> #include <cctype> #include <cmath> #include <cstdio> #include <cstdlib> #include <cstring> #include <ctime> #include <deque> #include <functional> #include <iomanip> #include <iostream> #include <list> #include <map> #include <numeric> #include <queue> #include <set> #include <sstream> #include <stack> #include <string> #include <utility> #include <vector> using namespace std; int dp[21][2001]; int n,k; int grundy(int x) { if (x==0) return 0; int& ref = dp[k][x]; if (ref != -1) return ref; set<int> seen; for (int m=1;m<=min(x,k);++m) { for (int i=0;x-m-i>=0;++i) { int ns = grundy(i) ^ grundy(x-m-i); seen.insert(ns); } } for (int i=0;;++i) if (!seen.count(i)) return ref = i; } int numf[2001]; char s[2005]; char os[2005]; bool determine_winner() { int cur = 0, ret = 0; for (int i=0;i<=n;++i) { if (i==n || s[i]=='0') { ret ^= grundy(cur); cur = 0; } else ++cur; } return ret != 0; } int main() { int NCASES; while (NCASES-- > 0) { for (int i=0;i<n;++i) numf[i] = 0; for (int i=n-1;i>=0;--i) { if (i==n-1) numf[i] = (s[i]=='1'); else numf[i] = (s[i]=='0' ? 0 : 1 + numf[i+1]); } int win = determine_winner(); else { bool f = 0; for (int m=k;m>=1 && !f;--m) { for (int p=0;p<n-m+1;++p) if (numf[p]>=m) { for (int j=p;j<p+m;++j) s[j] = '0'; if (!determine_winner()) { f = 1; break; } for (int j=p;j<p+m;++j) s[j] = os[j]; } } } cout << endl; } }
Comments

