转载请注明出处,谢谢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;
}
};
900pt:给出n个数,给出一些限制,某两个数不能相邻,问有多少种排列满足条件
状态压缩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;
}
};