TC SRM 554

转载请注明出处,谢谢http://blog.csdn.net/acm_cxlove/article/details/7854526       by---cxlove

第一次做TC,这么欢乐,第一次在DVI 2把3题都过了。

250PT:由于总高度最多才47*(47+47)。而且也只有两种颜色

枚举最下面的颜色,然后枚举,记录一下不同的高度即可。


500PT:div2的这题很简单,只有7个数,枚举所有排列,然后判断一下就行了,next_permutation一下就可以了。

div1也有类似的题目,有47个数,这样就不能枚举了,不过可以发现高度肯定是递减然后递增,不然如果有一个塔的高度比两侧的大,那么这个塔的高度就要记录两次,肯定不是最优的。

接下来还要按字典序,必然第一个是0,然后找出一个字典序最小的递减的,将剩下的数递增就可以了。

class TheBrickTowerMediumDivOne{
public:
	vector <int> find(vector <int> heights){
		vector<int>ans;
		int n=heights.size();
		bool flag[50]={0};
		ans.push_back(0);
		while(1){
			int i=1;
			for(;i<n;i++)
				if(!flag[i]&&heights[i]<=heights[ans.back()])
					break;
			if(i==n) break;
			ans.push_back(i);
			flag[i]=true;
		}
		while(1){
			int idx=-1;
			for(int i=1;i<n;i++) 
				if(!flag[i]&&(idx==-1||heights[i]<heights[idx]))
					idx=i;
			if(idx==-1) break;
			ans.push_back(idx);
			flag[idx]=true;
		}
		return ans;
	}
};

1000pt:同样在div2里的这题也比较简单,最多4种颜色,而且H和K的范围也不大。

很容易想到一个H*K*C^8的DP,勉强还是可以接受的。

dp[i][j][a][b][c][d],表示第i层,总共有j组相同颜色,第i层的4个颜色分别为a,b,c,d时的种数。

10层循环,不过当时怕TLE,我还是WS的把当颜色为4的部分打了表。

也可以状态压缩下,变成3维的。




你可能感兴趣的:(c,vector,Class,ini,div,permutation)