TC SRM 562 DIV 2

转载请注明出处,谢谢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;
	}
};



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值