F - Dominoes(贪心)

F - Dominoes(贪心)

思路:因为要使最大列1的个数最小,所以根据贪心思想,我们要尽可能地将1平摊每一列,因此我们优先对
1的个数多进行放置,优先级: { 11 , 01 , 10 , 00 } \{11,01,10,00\}
我们先从左到右,从上到下放 11 11 ,然后再放 01 01 10 10 ,因为要是每列平摊,所以这一行的两列放的 01 01 ,下一列如果有 10 10 就要放 10 10 ,这样才能起到平摊的效果,最后放00即可。

时间复杂度: O ( 2 n m ) O(2nm)

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e3+10;
int a[N][N];
int cnt[3];
int main(){
	int n,m,x;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
		{
			scanf("%d",&x);
			if(x==0) cnt[x]++;
			else if(x==11) cnt[2]++;
			else cnt[1]++;
		}
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
		{
			if(a[i][j]) continue;
			if(cnt[2]){
				a[i][j]=11;
				cnt[2]--;
				continue;
			}
			if(cnt[1]){
				a[i][j]=1;
				cnt[1]--;
				if(cnt[1]&&i<n){
					a[i+1][j]=10;
					cnt[1]--;
				}
			}
		}
		for(int i=1;i<=n;i++)
		{	
			for(int j=1;j<=m;j++)
			{
				printf("%02d ",a[i][j]);
			}
			puts("");
		}
		return 0;
}
原创文章 201 获赞 165 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_45750972/article/details/105915559