CF1774D 题解
Dream_weavers · · 题解
题意
给出
思路
贪心思路其实挺好想的。
要让每个数组
每次交换只能选择两个数组。先统计出一个数组中
-
如果
cnt<\frac{sum}{n} ,就要把数组中的一些0 变为1 -
如果
cnt>\frac{sum}{n} ,就要把数组中的一些1 变为0
注意在位置
代码
void solve(){
scanf("%d%d",&n,&m);
init();
for(int i=0;i<n;i++){
int tmp=0;
for(int j=0;j<m;j++){
int x;scanf("%d",&x);
a[i].push_back(x);
sum+=x,tmp+=x;
}
cnt.push_back(tmp);
}
if(sum%n!=0){
puts("-1");
return;
}
sum/=n;
for(int i=0;i<m;i++){
locmore.clear(),locless.clear();
for(int j=0;j<n;j++){
if(cnt[j]>sum&&a[j][i])locmore.push_back(j);
if(cnt[j]<sum&&!a[j][i])locless.push_back(j);
}
int len=min(locmore.size(),locless.size());
for(int j=0;j<len;j++){
ans[++tot]=(node){locless[j],locmore[j],i};
cnt[locmore[j]]--,cnt[locless[j]]++;
}
}
printf("%d\n",tot);
for(int i=1;i<=tot;i++)printf("%d %d %d\n",ans[i].x+1,ans[i].y+1,ans[i].z+1);
}