题目地址:http://codeforces.com/contest/1255/problem/D
题意:给k只鸡分米,地里有的有米有的没有米,所有鸡分的差值要最小,分的地要连起来才能算是一个集合的。
思路:遍历一遍地图即可,关键在于要弓字形的走,这样就能保证每只鸡的地在一起了。设米的总数为sum,则每只鸡可以分 sum/k 块有米的地。sum%k的均分就是了(这里看代码就懂了)。
AC代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 typedef long long ll; 7 char s[63]; 8 void sol(){ 9 int r,c,k; 10 scanf("%d%d%d",&r,&c,&k); 11 char maps[101][101]; 12 for(int i=0;i<r;i++) 13 scanf("%s",maps[i]); 14 int sum=0; 15 for(int i=0;i<r;i++) 16 for(int j=0;j<c;j++) 17 if(maps[i][j]=='R') sum++; 18 int a=0,b=0; 19 for(int i=0;i<r;i++){ 20 if(i&1){ 21 for(int j=0;j<c;j++){ 22 if(b+(maps[i][j]=='R')>((a<sum%k)?(sum/k+1):(sum/k))){ //先分sum%k个sum/k+1,剩下的分sum/k 23 a++; 24 maps[i][j]=s[a]; 25 b=1; 26 } 27 else{ 28 b+=(maps[i][j]=='R'); //每分到一块有米的地记录一下 29 maps[i][j]=s[a]; 30 } 31 } 32 } 33 else{ 34 for(int j=c-1;j>=0;j--){ 35 if(b+(maps[i][j]=='R')>((a<sum%k)?(sum/k+1):(sum/k))){ 36 a++; 37 maps[i][j]=s[a]; 38 b=1; 39 } 40 else{ 41 b+=(maps[i][j]=='R'); 42 maps[i][j]=s[a]; 43 } 44 } 45 } 46 } 47 for(int i=0;i<r;i++){ 48 for(int j=0;j<c;j++) 49 printf("%c",maps[i][j]); 50 printf(" "); 51 } 52 } 53 int main(){ 54 int T; 55 cin>>T; 56 for(int i=0;i<62;i++){ 57 if(i<26) s[i]=i+'a'; 58 else if(i<52) s[i]=i-26+'A'; 59 else s[i]=i-52+'0'; 60 } 61 while(T--) sol(); 62 return 0; 63 }