第一次参加TopCoder的SRM,时间是美国时间21点,北京时间10点(昨天),所以时间还是比较合适的。因为自己本身就是Not Rated,所以被分到了division 2。
最后提交了2题,不过很让人伤心的是,由于TopCoder本身的系统出了点问题,所以比赛结果宣布无效。。。。。。所以我现在还是Not Rated,好伤心……
第一题水题,排序然后判断一下就好了,最后也如预期的Pass System Test
#include <vector> #include <list> #include <map> #include <set> #include <deque> #include <stack> #include <bitset> #include <algorithm> #include <functional> #include <numeric> #include <utility> #include <sstream> #include <iostream> #include <iomanip> #include <cstdio> #include <cmath> #include <cstdlib> #include <ctime> using namespace std; class CucumberMarket { public: string check(vector <int>, int, int); }; string CucumberMarket::check(vector <int> price, int budget, int k) { int len=price.size(); sort(price.begin(),price.end()); int cost=0; for(int i=0;i<k;i++){ cost+=price[len-1-i]; } if(budget>=cost) return "YES"; else return "NO"; } //Powered by [KawigiEdit] 2.0!
#include <vector> #include <list> #include <map> #include <set> #include <deque> #include <stack> #include <bitset> #include <algorithm> #include <functional> #include <numeric> #include <utility> #include <sstream> #include <iostream> #include <iomanip> #include <cstdio> #include <cmath> #include <cstdlib> #include <ctime> using namespace std; class PastingPaintingDivTwo { public: long long countColors(vector <string>, int); }; long long PastingPaintingDivTwo::countColors(vector <string> clipboard, int T) { int row=clipboard.size(); int col=clipboard[0].size(); int begin=-(col-1); int end=(col-1);//应该是 end=(row-1); 才对。。。 血泪教训啊。。。 long long counter[200]; for(int i=0;i<200;i++) counter[i]=0; long long result=0; for(int k=begin;k<=0;k++){ int i=0; int j=i-k; bool find_begin=false; int end_position=-1; for(i=0;i<row;i++){ j=i-k; if(j>=col) break; if(clipboard[i][j]=='B'){ if(find_begin==false){ end_position=i+T; counter[k+col]+=T; } find_begin=true; counter[k+col]+=min((i+T)-end_position,T); end_position=i+T; } } } for(int k=1;k<=end;k++){ int j=0; int i=j+k; bool find_begin=false; int end_position=-1; for(j=0;j<col;j++){ i=j+k; if(i>=row) break; if(clipboard[i][j]=='B'){ if(find_begin==false){ end_position=i+T; counter[k+col]+=T; } find_begin=true; counter[k+col]+=min((i+T)-end_position,T); end_position=i+T; } } } for(int i=0;i<200;i++){ result+=counter[i]; } return result; } //Powered by [KawigiEdit] 2.0!
Division2_problem3: RandomOption
分析:比赛的时候愣是没看懂题意(囧……),这道题和俄罗斯方块的游戏比较像,就是一堆方块一层一层地落下来,是有关概率论的(我觉得自己白学概率统计了……)。
一种思路是进行递归,将原问题分解为一系列的子问题,并且设定好边界条件,可惜在数据范围最大的时候会超时。
优化的方法就是备忘录形式的动态规划,记录一些已经计算出来的概率值即可。动规优化后,原先超出2s时限的数据,30ms可得到正确结果。
为了进一步优化,可以采用位操作来表示集合的组成。(我发现自从做了datalab之后,对位操作变得明显熟练了……)。
#include <vector> #include <list> #include <map> #include <set> #include <deque> #include <stack> #include <bitset> #include <algorithm> #include <functional> #include <numeric> #include <utility> #include <sstream> #include <iostream> #include <iomanip> #include <cstdio> #include <cmath> #include <cstdlib> #include <ctime> #include<string.h> #include<iomanip> using namespace std; class RandomOption { public: int len; int key; bool check[20][20]; double dp[1<<14][15]; double getProbability(int, vector <int>, vector <int>); double dfs(int remain, int last, int t); }; double RandomOption::getProbability(int keyCount, vector <int> badLane1, vector <int> badLane2) { double res=0; len=badLane1.size(); key=keyCount; //initialize variables memset(check,true,sizeof(check)); for(int i=0;i<len;i++){ check[badLane1[i]][badLane2[i]]=false; check[badLane2[i]][badLane1[i]]=false; } for(int i=0;i<(1<<14);i++) for(int j=0;j<15;j++) dp[i][j]=-1; int begin=(1<<keyCount)-1; res=dfs(begin, keyCount, keyCount); return res; } double RandomOption::dfs(int remain, int last, int t){ //boundary conditions if(remain==0 || t==0) return 1.0; if(dp[remain][last]!=-1) return dp[remain][last]; double result=0; for(int i=0;i<key;i++){ if( ((1<<i)&remain) && check[i][last]==true){ result += (1.0/t)*dfs(remain&(~(1<<i)), i, t-1); } } dp[remain][last]=result; return result; } //<%:testing-code%> //Powered by [KawigiEdit] 2.0!
唉,还是不够仔细,得认真吸取教训。不过这种比赛还确实挺好玩的 ,有时间可以参加一下,不过美国时间的白天几乎总是北京时间的半夜,这点让人不太爽。
嗯嗯,加油~~