F - Dominoes(贪心)
思路:因为要使最大列1的个数最小,所以根据贪心思想,我们要尽可能地将1平摊每一列,因此我们优先对
1的个数多进行放置,优先级:
我们先从左到右,从上到下放
,然后再放
或
,因为要是每列平摊,所以这一行的两列放的
,下一列如果有
就要放
,这样才能起到平摊的效果,最后放00即可。
时间复杂度:
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;
}