转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents by---cxlove
第一次AK了div2,可以unrate了,sad,再也不相信爱情了。
总结:第一题,手速还可以,题目水
第二题,脑残了,一个溢出,debug了好久,导致这题拿到的pt很低
第三题,开始想歪了
cha:在code环节连数据范围都没注意,导致cha人的时候,数据范围搞错,错失良机(ps:今天的网络卡了
250pt:
从一些物品中任意选k个购买,都能在预算以内
那就判断最大的k个是否满足
class CucumberMarket { public: string check(vector <int> price, int budget, int k) { sort(price.begin(),price.end()); int n=price.size(); int tmp=0; for(int i=n-1;i>n-1-k;i--) tmp+=price[i]; if(tmp>budget) return "NO"; else return "YES"; } };
500pt:给出一个矩阵,B表示该象素被染色,将这个矩阵,复制,向右下移一步,然后粘贴,重复T次,问有多少个象素染色
主要就是计算一下重复的有多少,减掉就行了。
我的做法是,先考虑向右下移一步,判断有多少重复的。
然后向右下移两步,判断有多少重复的,(注意:不能计算重复的,第一次匹配之后便标记掉
class PastingPaintingDivTwo { public: long long countColors(vector <string> clipboard, int T) { int row=clipboard.size(); int col=clipboard[0].size(); int cnt=0; vector<string> c(clipboard); for(int i=0;i<row;i++) for(int j=0;j<col;j++) if(clipboard[i][j]=='B') cnt++; int dp[55]; mem(dp,0); for(int k=1;k<row;k++) { for(int i=0;i<row-k;i++) { for(int j=0;j<col-k;j++) { if(clipboard[i][j]=='B'&&'B'==c[i+k][j+k]) { dp[k]++; clipboard[i][j]='.'; } } } } long long ans=(long long )T*cnt; for(int i=1;i<row;i++) { if(T>i) ans-=(LL)(T-i)*dp[i]; } return ans; } };
状态压缩DP,dp[i][j][k]表示第i个位置是数字j,状态为k的种数
LL dp[15][15][1<<14]; class RandomOption { public: double getProbability(int keyCount, vector <int> badLane1, vector <int> badLane2){ double tot=1.0; mem(dp,0); bool flag[15][15];mem(flag,false); for(int i=0;i<badLane2.size();i++) { int u=badLane2[i],v=badLane1[i]; flag[u][v]=true; flag[v][u]=true; } for(int i=1;i<=keyCount;i++) tot*=i; for(int i=0;i<keyCount;i++) dp[1][i][1<<i]=1; test; for(int i=1;i<keyCount;i++) { for(int j=0;j<keyCount;j++) { for(int pre=0;pre<(1<<keyCount);pre++) { for(int k=0;k<keyCount;k++) { if(flag[j][k]||(pre&(1<<k))) continue; int now=pre|(1<<k); dp[i+1][k][now]+=dp[i][j][pre]; } } } } test; double ans=0; for(int i=0;i<keyCount;i++) ans+=dp[keyCount][i][(1<<keyCount)-1]; return ans/tot; } };